http://acm.hdu.edu.cn/showproblem.php?pid=1561
树形dp:
1 #include<iostream> 2 #include<cstring> 3 #include<vector> 4 using namespace std; 5 6 const int mx=222; 7 int dp[mx][mx]; 8 vector<int>g[mx]; 9 10 void dfs(int x,int m) 11 { 12 if (m==0) return ; 13 for (int i=0;i<g[x].size();i++) 14 { 15 int cut=g[x][i]; 16 dfs(cut,m-1); 17 for (int j=m;j>=1;j--) 18 { 19 int v=j; 20 for(int k=1;k<v;k++) 21 { 22 dp[x][v]=max(dp[x][v],dp[x][v-k]+dp[cut][k]); 23 } 24 } 25 } 26 } 27 28 int main() 29 { 30 int n,m; 31 while(cin>>n>>m) 32 { 33 memset(dp,0,sizeof(dp)); 34 if (!n&&!m) return 0; 35 int a,i; 36 for (i=0;i<=n;i++) g[i].clear(); 37 for (i=1;i<=n;i++) 38 { 39 cin>>a>>dp[i][1]; 40 g[a].push_back(i); 41 } 42 dfs(0,m+1); 43 cout<<dp[0][m+1]<<endl; 44 } 45 }