![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
树形dp
winhcc
这个作者很懒,什么都没留下…
展开
-
hdu 2196
给一棵树,每条边有权值,对于每个点,求到该点的路径的最大权值。 树形dp 对于一个节点来说,到它的最大路径权值要么是它的子树中的节点到该点,要么是父亲节点的其他子树节点到该点。 dp[i][0] 表示以i为根节点的子树中到 i 的最大路径权值 dp[i][1] 表示以i为根节点的子树中到 i 的最大路径权值 dp[i][2] 表示i的父亲节点的除了i这棵子树外的其他子树到i的最大路径权值 dp[i...原创 2019-04-10 17:39:06 · 170 阅读 · 0 评论 -
Codeforces 1083A
给一棵树,每个节点、每条边都有权值,到一个会加上对应的权值,经过一条边会减去边上的权值,问从节点出发,最多能剩下多少权值。 树形dp,对于一个节点u,不可能又算它的父亲节点,又算它的两个两个(或以上)的儿子,原因是路径无法重复走。 dp[u]表示u到它的一个叶子节点的最大剩余的权值。 dp[u] = max(val[u] + dp[v] - cost(u,v)) v是u的孩子 更新答案时,首先要判...原创 2019-04-16 19:59:08 · 435 阅读 · 0 评论 -
hdu 1561
树形依赖背包。 多表示一个根节点,就是在(n+1)个节点里面选(m+1)个节点,使得获得的宝物最多。 dp[u][i]表示在以u为根节点的树中,选i个节点的获得的最大价值 递推公式 dp[u][i] = dp[u][k] + dp[v][i-k] ,v 是 u的孩子节点 答案就是dp[0][m+1] #include <cstdio> #include <algorithm>...原创 2019-04-15 17:10:48 · 61 阅读 · 0 评论 -
hdu 1561
树形依赖背包。 多表示一个根节点,就是在(n+1)个节点里面选(m+1)个节点,使得获得的宝物最多。 dp[u][i]表示在以u为根节点的树中,选i个节点的获得的最大价值 递推公式 dp[u][i] = dp[u][k] + dp[v][i-k] ,v 是 u的孩子节点 答案就是dp[0][m+1] #include <cstdio> #include <algorithm>...原创 2019-04-12 00:00:02 · 145 阅读 · 0 评论 -
poj 3140
给一棵树(题目明确没说),求删一个点后连通分量之差最小, 树形dp d[i]表示以i为根节点的树的和,则删除该节点后的差就是 |sum - 2*d[i]| 注意 long long 取绝对值是llabs #include <cstdio> #include <algorithm> #include <cstring> using namespace std; ...原创 2019-04-11 23:52:07 · 98 阅读 · 0 评论 -
poj 3140
给一棵树(题目明确没说),求删一个点后连通分量之差最小, 树形dp d[i]表示以i为根节点的树的和,则删除该节点后的差就是 |sum - 2*d[i]| 注意 long long 取绝对值是llabs #include <cstdio> #include <algorithm> #include <cstring> using namespace std; ...原创 2019-04-11 00:15:47 · 147 阅读 · 0 评论 -
poj 3107
给一棵树,求删除一个节点后最大连通分量最小的点 树形dp d[i][0] 表示 以i为根节点的子树的总结点数(i不算) d[i][1] 表示以i为根节点的树的最大的子树的结点数 d[i][2] 表示整个树除了子树i外的结点数 则所求的就是要max(d[i][1],d[i][2])尽可能的小 最后该题卡STL,所以要用链式向前星 最后链式向前星的next和to数组要开 N*2 那么大,存双向边~ #...原创 2019-04-10 23:48:34 · 248 阅读 · 0 评论 -
poj 2378
给一棵树,求删除某个节点,使得剩下的最大的连通分量的最大值小于总结点的一半 树形dp d[i][0]表示以i为根节点的树的总节点数(除了i) d[i][1]表示以i为根节点的树的最大的子树的节点数 则若满足d[i][1] <= n/2 并且 n-1-d[i][0] <= n/2 ,节点i就是满足条件的一个 #include <cstdio> #include <alg...原创 2019-04-10 23:41:31 · 123 阅读 · 0 评论 -
hdu 1520
n个人,每个人有一个值,n个人的关系构成一棵树,选中一个节点后所有儿子节点都不能选,问能选的最大的值是多少。 树形dp, dp[i][0/1] 表示选/不选第 i个节点的情况下能获得的最大值。 设v 是u的子节点 dp[u][0] = sum(max{dp[v][0],dp[v][1]}); dp[u][1] = sum(dp[v][0]) #include <cstdio> #inc...原创 2019-04-06 16:46:36 · 103 阅读 · 0 评论 -
Codeforces 1092F
给一棵树,对于每一个节点u,有一个值 sum(dist(u,v)*val[v] ) ,v是其他节点,求最大的值。 树形dp 如果v 是 u 的孩子节点, 则以v为根节点的子树对u 的贡献就是子树中所有节点的和。 先求出以u为根节点的子树的权值和。可以一边dfs一边算答案,当由u 转移到 v 时 ,当前的值 要减去 sum[v] ,再加上 sum[u] - sum[v] , 上面两步好想,关键是算v...原创 2019-04-16 20:29:57 · 195 阅读 · 0 评论