UVA12186 工人的请愿书 Another Crisis (树形DP)
作者:互联网
dp[i]表示要让i向上级发请愿书,最少需要多少个工人递交请愿书,因为要取前T%最小的,所以还要将i的子节点排序(这里用vector实现),取前c个最小的作为dp[i]的值。
这里用dfs可以省去dp数组,用返回值的方式实现。
1 #include<cstdio> 2 #include<cstring> 3 #include<vector> 4 #include<algorithm> 5 #include<stdlib.h> 6 #include<iostream> 7 #include<cmath> 8 using namespace std; 9 int n,t; 10 vector<int> E[100005]; 11 12 int dfs(int u){//用返回值的方式,省略dp数组 13 if(E[u].size()==0) return 1;//工人 14 int k=E[u].size(); 15 vector<int> d;//用于排序 16 for(int i=0;i<k;i++) 17 d.push_back(dfs(E[u][i])); 18 sort(d.begin(),d.end()); 19 int ans=0,c=ceil(k*t/100.0);//至少收到c个,才会再向上提交 20 for(int i=0;i<c;i++) ans+=d[i]; 21 return ans; 22 } 23 24 int main(){ 25 while(scanf("%d%d",&n,&t)!=EOF&&n!=0&&t!=0){ 26 for(int i=0;i<=n;i++) E[i].clear(); 27 for(int i=1;i<=n;i++){ 28 int x; 29 scanf("%d",&x); 30 E[x].push_back(i);//老板向直接下属连边 31 } 32 printf("%d\n",dfs(0)); 33 } 34 return 0; 35 }
标签:int,请愿书,vector,Another,UVA12186,include,Crisis,dp,size 来源: https://www.cnblogs.com/yhxnoerror/p/16387611.html