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 }

 

posted on 2016-03-08 15:31  pb2016  阅读(176)  评论(0编辑  收藏  举报