树形 DP
Summary
树形 DP 在树上做动态规划,通常设状态表示以某点为根的子树的某种最优值,自底向上由各子节点的状态合并而来,一遍 DFS 即可完成。以「没有上司的舞会」为例,对每个节点分选与不选两态:选它则其子节点都不能选,不选它则子节点取选或不选的较大者,父节点由各子节点逐个转移累加。文末给出换根 DP 的入口,指向树的重心一节,用于在把根从一个点换到相邻点时快速统计以各点为根时的信息,避免逐点重算。
参考资料
简介
树形 DP 在树上做动态规划,通常设 表示以 为根的子树的某种最优值,自底向上由各子节点的状态合并而来,用一遍 DFS 实现。
实现
以「没有上司的舞会」为例:、 分别表示不选、选节点 时子树的最大权值。选 则子节点都不能选,不选 则子节点选或不选取较大者。
void dfs(int u)
{
for(auto v:G[u])
{
dfs(v);
f[u][0]+=max(f[v][0],f[v][1]);
f[u][1]+=f[v][0];
}
}
换根 DP
详见 树的重心。