codevs 1378选课 树形DP

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 int N,M,tl[303],tr[303],f[303][303],num[303],con[303];
 6 void insect(int fa,int now)
 7 {
 8     if (tl[fa]==0)
 9      {tl[fa]=now;}
10     else
11      {
12          int i=tl[fa];
13          while (tr[i]!=0) i=tr[i];
14          tr[i]=now;
15      }
16 }
17 void dfs(int x)
18 {
19     if (tr[x]!=0) dfs(tr[x]);
20     if (tl[x]!=0) dfs(tl[x]);
21     con[x]=con[tr[x]]+con[tl[x]]+1;
22     int i,j;
23     f[x][1]=num[x];
24     for (i=0;i<=con[tr[x]];++i)
25     {
26         f[x][i]=max(f[x][i],f[tr[x]][i]);
27         for (j=0;j<=con[tl[x]];++j)
28          f[x][i+j+1]=max(f[x][i+j+1],num[x]+f[tr[x]][i]+f[tl[x]][j]);
29     }
30 }
31 int main()
32 {
33     memset(f,0,sizeof(f));
34     memset(tl,0,sizeof(tl));
35     memset(tr,0,sizeof(tr));
36     memset(con,0,sizeof(con));
37     memset(num,0,sizeof(num));
38     scanf("%d %d\n",&N,&M);
39     int i,j,x,y;
40     for (i=1;i<=N;++i)
41     {
42         scanf("%d %d\n",&x,&num[i]);
43         insect(x,i);
44     }
45     dfs(tl[0]);
46     printf("%d\n",f[tl[0]][M]);
47 }

 

转载于:https://www.cnblogs.com/abclzr/p/5086770.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值