牛客算法进阶——树形dp

1. 小G有一个大树(求树的重心)

删除该点后最大连通块的节点数最小

设f[x]表示以x为根的子树大小,那么删除x之后的各子树大小为f[to]和n-f[x]

求max(max(f[to]),n-f[x])的最小值以及最小值所对的x

2.没有上司的舞会

儿子和父亲不能同时选择

设dp[x][0/1]表示x节点不选/选,他的子树快乐最大值是多少

dp[x][0] += max(dp[x][0],dp[x][1]);
dp[x][1] += dp[x][0];

最后答案为max(dp[x][0],dp[x][1]);

3.Cell Phone Network

一个点可以关联它与它相邻的点

设dp[x][0/1/2]表示被他的儿子/父亲/自己关联

dp[x][0] += min(dp[to][0],dp[to][2]) 特殊情况是儿子都是被儿子的儿子关联,没有儿子能关联他,这时要加上min(dp[to][2]-dp[to][0]) > 0
dp[x][1] += min(dp[to][0],min(dp[to][1],dp[to][2]))
dp[x][2] += min(do[to][0],dp[to][2]);

最后答案为min(dp[to][0],dp[to][2]);

4.二叉苹果树

选儿子必须选父亲->看成树上依赖背包

dp[x][j]表示i为根的子树内连续选j条边的最大苹果树

dp[x][j] = max(dp[x][j],dp[x][j-k-1]+dp[to][k]+w) 注意j要倒序处理,防止重复选择一颗子树

答案为dp[1][m]

5.树上子链

带权树上直径

经过x的最长链为最长链+次长链

6.Rinne Loves Edges

弱化版的吉吉国王

7.吉吉国王

最长长度最小(二分)

dp[x]表示把x子树内的叶子切断的最小代价

当w>规划的最长长度 dp[x] += dp[to];
当w<规划的最长长度 dp[x] += min(dp[to],w);

posted @ 2023-01-29 13:40  小又又yyyy  阅读(19)  评论(0编辑  收藏  举报