
树形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 · 196 阅读 · 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 · 465 阅读 · 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 · 81 阅读 · 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 · 163 阅读 · 0 评论 -
poj 3140
给一棵树(题目明确没说),求删一个点后连通分量之差最小,树形dpd[i]表示以i为根节点的树的和,则删除该节点后的差就是 |sum - 2*d[i]|注意 long long 取绝对值是llabs#include <cstdio>#include <algorithm>#include <cstring>using namespace std;...原创 2019-04-11 23:52:07 · 113 阅读 · 0 评论 -
poj 3140
给一棵树(题目明确没说),求删一个点后连通分量之差最小,树形dpd[i]表示以i为根节点的树的和,则删除该节点后的差就是 |sum - 2*d[i]|注意 long long 取绝对值是llabs#include <cstdio>#include <algorithm>#include <cstring>using namespace std;...原创 2019-04-11 00:15:47 · 177 阅读 · 0 评论 -
poj 3107
给一棵树,求删除一个节点后最大连通分量最小的点树形dpd[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 · 273 阅读 · 0 评论 -
poj 2378
给一棵树,求删除某个节点,使得剩下的最大的连通分量的最大值小于总结点的一半树形dpd[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 · 145 阅读 · 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 · 120 阅读 · 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 · 212 阅读 · 0 评论