HDU 1561 The more, The Better(树形DP)

题目链接

和Vijos上的选课一模一样。。无奈效率700+,怎么这么慢啊。。。

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 struct node
 5 {
 6     int left,right;
 7 }tree[301];
 8 int p[301],dp[301][301];
 9 int max(int a,int b)
10 {
11     return a > b? a:b;
12 }
13 void insert(int son,int father)
14 {
15     int t;
16     if(!tree[father].left)
17     {
18        tree[father].left = son;
19     }
20     else
21     {
22         t = tree[father].left;
23         while(tree[t].right)
24         {
25             t = tree[t].right;
26         }
27         tree[t].right = son;
28     }
29 }
30 int dfs(int x,int y)
31 {
32     int i;
33     if(dp[x][y] > 0)
34     return dp[x][y];
35     if(x == 0||y == 0)
36     return 0;
37     dp[x][y] = dfs(tree[x].right,y);
38     for(i = 0;i <= y-1;i ++)
39     {
40         dp[x][y] = max(dp[x][y],dfs(tree[x].left,i)+dfs(tree[x].right,y-1-i)+p[x]);
41     }
42     return dp[x][y];
43 }
44 int main()
45 {
46     int n,m,i,a;
47     while(scanf("%d%d",&n,&m)!=EOF)
48     {
49         if(!n&&!m) break;
50         memset(tree,0,sizeof(tree));
51         memset(dp,0,sizeof(dp));
52         for(i = 1;i <= n;i ++)
53         {
54             scanf("%d%d",&a,&p[i]);
55             insert(i,a);
56         }
57         printf("%d\n",dfs(tree[0].left,m));
58     }
59     return 0;
60 }

 

posted @ 2012-09-06 10:36  Naix_x  阅读(247)  评论(8编辑  收藏  举报