「REMAKE系列」树形dp篇
总结
树上背包
- 树上背包计数 P4516 [JSOI2018] 潜入行动
基环树上dp
- 树上最大独及集 + 基环树 P2607 [ZJOI2008] 骑士
树上路径
- ,要求选择一些路径,使得每个点至多在一条路径上,并且路径的权值和最大。代码源树上路径1
换根dp
基础树形dp
- 选取最少点位,每个选取点位能是周围点和自己加入集合,最少点位数让所有点在集合中。P2899 [USACO08JAN]Cell Phone Network G
习题
一些做对了一半的题
CF533B. Work Group
状态设计的差不多,自己的转移太复杂而且玄学,应该重新想想是不是可以简化。
洛谷P2899 [USACO08JAN]Cell Phone Network G
题意
John 想让他的所有牛用上手机以便相互交流,他需要建立几座信号塔在 块草地中。已知与信号塔相邻的草地能收到信号。给你 个草地(A,B)的相邻关系,问:最少需要建多少个信号塔能实现所有草地都有信号。
思路
- 写的时候少加了一个状态,然后加上原来的思路就ac了。
- 看起来和没有上司的舞会有点像其实有一点区别,对于每个节点被儿子染色时,儿子节点可以放也可以不放,每个节点还可以被父亲染色。
- 设计状态 表示节点被儿子染色自己不放, 表示结点自己放来染色自己, 表示节点自己不放被父亲染色。
- 转移写在代码里,注意的点是,节点被儿子染色,只需要大于等于 1 个儿子放就可以了,所以需要记录最优的情况。
- 实现:如果存在一个儿子放比不放其值更优,就简单了,如果不存在就找一个 放与不放 差值最小的来替代。
dls动态规划中级
树上路径1
- 表示当前 u 点对应路径最高点的路径选或不选的最大值。
- u 点没有路径,则最大值为儿子节点 dp 权值和。
- u 点有路径,要与路径上节点儿子权值加和后取 ,路径上的点 dp 权值和不计入。
- 所以有一个巧妙办法,选取了一段路径,对于路径上的点可以等价于 。节点儿子dp权值和减去节点dp权值和。
- 以上可以用 BIT + DFS序优化到 nlogn 级别。
洛谷——「能力综合提升题单-树形DP篇」
P3047 [USACO12FEB]Nearby Cows G
提高+/省选- , 简单容斥
给你一棵 个点的树,点带权,对于每个节点求出距离它不超过 的所有节点权值和 。
思路
- 定义状态 距离点 u 距离不超过 j 的点权和。
- 第一次 dfs 转移:
f[u][j] += f[v][j - 1]
- 第二次 dfs 转移,由父节点更新子节点有点类似换根dp,但需要减去父节点和子节点的子树中重合的部分。
j:n->2, f[v][j] -= f[v][j - 2]
f[v][j] += f[u][j - 1]
P3698 [CQOI2017]小Q的棋盘
提高+/省选- ,简单树上背包
对于一颗树,现在想知道,当棋子从格点 0 出发,移动 N 步最多能经过多少格点。格点可以重复经过多次,但不重复计数。
P3177 [HAOI2015] 树上染色
提高+/省选- 树上背包、细节题、贡献考虑
有一棵点数为 的树,树边有边权。给你一个在 之内的正整数 ,你要在这棵树中选择 个点,将其染成黑色,并将其他 的 个点染成白色。将所有点染色后,你会获得黑点两两之间的距离加上白点两两之间的距离的和的受益。问受益最大值是多少。
对于 的数据,。
思路
- 直接设状态不好求,考虑按贡献求解,求出对于某一条边被经过了多少次。
- 显然是边左右两侧同色点的对数乘积。有一些细节,看代码实现就行。
P2607 [ZJOI2008] 骑士
P4516 [JSOI2018] 潜入行动
题意略
- 设状态为 ,u 点子树放了 j 个装置,u 点有没有放装置,u 点有没有被监听的方案数。
- 对于转移时两点 u, v,考虑 u 点的情况
- 如果 u 没有放装置也没有被监听,v 一定不能放装置但 v 要被监听(否则 u 被监听)。
-
- 如果 u 没有放装置但被监听,v 的状态为被监听。对于 dp[u][k][0][1] 放不放装置无所谓, 对于 dp[u][k][0][0] v 必须放装置。
-
- 如果 u 放了装置但没有被监听,v 有没有被监听无所谓,一定没有放装置。
-
- 如果 u 放了装置且被监听,对于 dp[u][k][1][0], v 一定放装置,有没有被监听无所谓。对于 dp[u][k][1][1] v 放不放装置,被不被监听都无所谓。
-
- 转移复杂度是 ,数组不能开 long long ,转以后再更新子树大小。
CodeForces
CF219D. Choosing Capital for Treeland
题意
Treeland国有n个城市,这n个城市连成了一颗树,有n-1条道路连接了所有城市。每条道路只能单向通行。现在政府需要决定选择哪个城市为首都。假如城市i成为了首都,那么为了使首都能到达任意一个城市,不得不将一些道路翻转方向,记翻转道路的条数为k。你的任务是找到所有满足k最小的首都。
思路
- 定义 表示到达子树所有点最小翻转次数, 表示到达父节点以上的所有点最小翻转次数。
- ,
CF1187E. Tree Painting
题意
给定一棵n个点的树 初始全是白点
要求你做n步操作,每一次选定一个与一个黑点相隔一条边的白点,将它染成黑点,然后获得该白点被染色前所在的白色联通块大小的权值。
第一次操作可以任意选点。求可获得的最大权值
思路
- 发现第一次选择一个点后方案固定。
- 再画一下有点类似换根dp,需要求出父节点以上连通块和自己子树的答案。
- 表示 u 子树的贡献, 表示 u 父节点以上的贡献。
-
- 对于每个节点答案为 ,加的部分补偿 i 作为第一个选的得分。
__EOF__

本文链接:https://www.cnblogs.com/Roshin/p/remake_tree_dp.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具