hdu1561(树形dp)
http://acm.hdu.edu.cn/showproblem.php?pid=1561
1 #include <iostream> 2 #include <vector> 3 #include <cstring> 4 #include <cstdio> 5 using namespace std; 6 const int Ni = 210; 7 int n,m; 8 int dp[Ni][Ni]; 9 bool vis[Ni]; 10 vector<int> dv[Ni]; 11 void dfs(int p) 12 { 13 int i,j,k; 14 vis[p]=1; 15 for(i=0;i<dv[p].size();i++) 16 { 17 int t=dv[p][i]; 18 if(!vis[t]) dfs(t); 19 for(j=m;j>=2;j--) 20 { 21 for(k=1;k<j;k++) 22 { 23 if(dp[p][k]!=-1&&dp[t][j-k]!=-1) 24 dp[p][j]=max(dp[p][j],dp[p][k]+dp[t][j-k]); 25 } 26 } 27 } 28 } 29 int main() 30 { 31 int pre,v,i; 32 while(scanf("%d%d",&n,&m),n+m) 33 { 34 for(i=0;i<=n;i++) dv[i].clear(); 35 memset(dp,-1,sizeof(dp)); 36 memset(vis,0,sizeof(vis)); 37 for(i=1;i<=n;i++) 38 { 39 scanf("%d%d",&pre,&v); 40 dv[pre].push_back(i); 41 dp[i][1]=v; 42 } 43 m++; 44 dp[0][1]=0; 45 for(i=0;i<=n;i++) dp[i][0]=0; 46 dfs(0); 47 printf("%d\n",dp[0][m]); 48 } 49 return 0; 50 }