树上DP笔记
树是一个由
在树上设计动态规划算法时,一般以节点从深到浅的顺序作为 DP 的阶段。大多数时候,采用递归的方式实现树形动态规划。
对于每一个节点
例题 P1352
以节点编号作为 DP 状态的第
那么状态转移方程为:
如果是叶子结点,那么:
设根节点为
#include<bits/stdc++.h> using namespace std; int n,r[100009],f[100009][2]; vector<int> to[100009]; void dp(int x,int fa){ for(int i=0;i<to[x].size();i++){ if(to[x][i]==fa) continue; dp(to[x][i],x); } for(int i=0;i<to[x].size();i++){ f[x][0]+=max(f[to[x][i]][0],f[to[x][i]][1]); f[x][1]+=f[to[x][i]][0]; } f[x][1]+=r[x]; return ; } int main(){ cin>>n; for(int i=1;i<=n;i++) cin>>r[i]; for(int i=1;i<=n-1;i++){ int x,y; cin>>x>>y; to[x].push_back(y); to[y].push_back(x); } dp(1,0); cout<<max(f[1][0],f[1][1]); return 0; }
例题 P2014
我们定义
如果
当
当
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll n,m,s[1009],f[1009][1009]; vector<int> to[1009]; void dp(int x){ f[x][0]=0; for(int i=0;i<to[x].size();i++){ int y=to[x][i]; dp(y); for(int t=m;t>=0;t--){ for(int j=0;j<=t;j++) f[x][t]=max(f[x][t],f[x][t-j]+f[y][j]); } } if(x!=0){ for(int t=m;t>0;t--) f[x][t]=f[x][t-1]+s[x]; } return ; } int main(){ cin>>n>>m; for(int i=1;i<=n;i++){ int ki,si; cin>>ki>>si; to[ki].push_back(i); s[i]=si; } dp(0); cout<<f[0][m]; return 0; }
例题 P4395
题目和气垫车有什么关系
看到题目的第一反应可能是贪心
进过一系列玄学计算可以算出取值上界大约是
如果
否则
答案为
#include<bits/stdc++.h> using namespace std; int n,f[10009][29]; vector<int> to[10009]; void dp(int x,int fa){ for(int i=1;i<=20;i++) f[x][i]=i; for(int i=0;i<to[x].size();i++){ if(to[x][i]==fa) continue; dp(to[x][i],x); for(int j=1;j<=20;j++){ int minn=0x3f3f3f3f; for(int k=1;k<=20;k++){ if(j==k) continue; minn=min(minn,f[to[x][i]][k]); } f[x][j]+=minn; } } return ; } int main(){ cin>>n; for(int i=1;i<=n-1;i++){ int x,y; cin>>x>>y; to[x].push_back(y); to[y].push_back(x); } dp(1,0); int ans=0x3f3f3f3f; for(int i=1;i<=20;i++) ans=min(ans,f[1][i]); cout<<ans; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具