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

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 }
分类:
ACM题解
【推荐】2025 HarmonyOS 鸿蒙创新赛正式启动,百万大奖等你挑战
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】开源 Linux 服务器运维管理面板 1Panel V2 版本正式发布
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 Redis 客户端超时到 .NET 线程池挑战
· C23和C++26的#embed嵌入资源指南
· 「EF Core」框架是如何识别实体类的属性和主键的
· 独立开发,这条路可行吗?
· 我在厂里搞 wine 的日子
· 他没买 iPad,而是花了半年时间,为所有“穷学生”写了个笔记神器
· Visual Studio 现已支持新的、更简洁的解决方案文件(slnx)格式
· 只需一行命令,Win11秒变Linux开发主机!
· 也是出息了,业务代码里面也用上算法了。
· 上周热点回顾(7.7-7.13)