HDOJ树形DP专题之The more, The Better

题目链接

这题要用左二子,右兄弟的存储结构来存树(附加一个结点0,将森林连成树),然后就是在二叉树上DP。

复制代码
View Code
 1 #include <stdio.h>
 2 #include <memory.h>
 3 #define MAX(a,b) ((a)>(b)?(a):(b))
 4 #define N 205
 5 int son[N],bro[N],w[N],n,m;
 6 int c[N][N];
 7 void Insert(int u,int fa,int x)
 8 {
 9   w[u]=x;
10   if(son[fa]==-1) son[fa]=u;
11   else  bro[u]=bro[son[fa]],bro[son[fa]]=u;
12 }
13 int dp(int r,int k)
14 {
15   int i,ret;
16   if(r==-1 || !k)  return 0;
17   if(c[r][k]!=-1) return c[r][k];
18   ret=dp(bro[r],k);
19   for(i=0;i<k;i++) ret=MAX(ret,w[r]+dp(son[r],i)+dp(bro[r],k-1-i));
20   return c[r][k]=ret;
21 }
22 int main()
23 {
24   int i,fa,x;
25   while(~scanf("%d%d",&n,&m)&&n)
26   {
27     memset(son,-1,sizeof(son));
28     memset(bro,-1,sizeof(bro));
29     for(i=1;i<=n;i++)
30     {
31       scanf("%d%d",&fa,&x);
32       Insert(i,fa,x);
33     }
34     w[0]=0;
35     memset(c,-1,sizeof(c));
36     printf("%d\n",dp(0,m+1));
37   }
38   return 0;
39 }
复制代码

 

posted @ 2012-04-27 09:50  BeatLJ  阅读(244)  评论(0)    收藏  举报
编辑推荐:
· InnoDB为什么不用跳表,Redis为什么不用B+树?
· 记一次 C# 平台调用中因非托管 union 类型导致的内存访问越界
· [EF Core]聊聊“复合”属性
· 那些被推迟的 C# 14 特性及其背后的故事
· 我最喜欢的 C# 14 新特性
阅读排行:
· 博客园出海记-开篇:扬帆启航
· 微软开源的 MCP 教程「GitHub 热点速览」
· 记一次 .NET 某汽车控制焊接软件 卡死分析
· 关于布尔类型的变量不要加 is 前缀,被网友们吐槽了,特来完善下
· C#中的多级缓存架构设计与实现深度解析
点击右上角即可分享
微信分享提示