树形dp
文章平均质量分 67
蹲坑看手机
已搬家
展开
-
Neko and tree - 树上背包问题
思路网上有很多题解貌似对这个dp的状态都没有说清楚,下面尝试说清楚一点:dp[u][len]dp[u][len]dp[u][len]表示以u为根结点的子树中,距离u结点最远为len的一个点必选的的方案数,注意是距离u结点的距离恰好为len的那一群点中,其中选某几个(大于等于1)的总方案数,(这个状态我也不知道为什么要这样定义,反正我是想不到的)则转移可以由组合数学的思想来进行转移dp[u][max(i,j+1)]=dp[u][i]+dp[u][i]×dp[son][j]dp[u][max(i,.原创 2021-03-01 20:55:01 · 159 阅读 · 0 评论 -
有线电视网 - 树上背包
思路这题想了好久,唯一想到比较有用的就是假设dp[u][j]dp[u][j]dp[u][j]表示以u为根结点的子树花费j元最多可以提供多少用户,然后就没有然后了,都不知道怎么转移,看了学长巨巨的思路后发现新大陆,原来还可以利用换意的方式进行dp,即转台这样定义:dp[u][i]dp[u][i]dp[u][i]表示以u为根结点的子树提供j个用户最多能赚多少钱,这样转移又方便,最后的答案就是dp[1][i]dp[1][i]dp[1][i]中大于等于0的最大i转移方程:dp[u][i]=max{dp[s.原创 2021-03-01 12:48:24 · 98 阅读 · 0 评论 -
重建道路 - 树上背包
思路根据树上背包模型可以想到状态定义:dp[u][i]dp[u][i]dp[u][i]表示以u结点为根结点的子树生成只有i个结点的最少去掉的边数,转移方程如下:dp[u][i]=max{dp[son][j]+dp[u][i−j]}dp[u][i] = max\{ dp[son][j] + dp[u][i - j]\}dp[u][i]=max{dp[son][j]+dp[u][i−j]}和树上染色那题一样,需要i−ji - ji−j必须合法即必须不超过它自己的结点数才能转移且大于0,注意:转移还.原创 2021-03-01 12:32:32 · 142 阅读 · 0 评论 -
树上染色 - 树上背包
思路一道树形dp题,想了好久,最终看了题解发现是突破口不对突破口:首先思考怎么求一条边被算过的次数,用组合数学方法思考可以想到就是这条边两个方向(定义一个左边,一个右边)的黑点个数的乘积 + 白点个数的乘积假设左边黑点的个数是x,且其左边节点个数是size, 树的总结点个数为n,则这条边计算次数有下面的公式tot=x×(k−x)+(size−x)×(n−size−k+x)tot = x \times (k - x) + (size - x) \times (n - size - k + x).原创 2021-03-01 12:15:22 · 113 阅读 · 0 评论 -
树形背包思考模型
树形背包常用思考模型模型一首先对于每个节点我们在dfs中dp转移时可以想象成一个分组背包,每次新遍历一个子树就可以想象成一个分组背包的下一组,转移时利用之前的背包状态进行转移,如果觉得这个模型比较难理解可以看下面的模型二模型二首先对于每次新遍历一个结点我们都可以想象成是在给这个结点拼接一颗子树如下图解释:圆点为树的结点,三角形为一颗子树,线段为边,箭头是拼接方向。蓝色为之前计算好的状态的树,红色为即将拼接上去的一颗子树(这颗子树在dfs时计算好了所有状态)模型一与模型二的联系回到模型原创 2021-03-01 11:53:00 · 420 阅读 · 1 评论