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 }

 

你可能感兴趣的:(HDU)