树形DP总结

推荐博客高度总结(三大类):https://blog.csdn.net/m0_73386348/article/details/131838916

动态规划-树形类-总结

树形类的题,一般都需要用到子树的信息。

树形 DP 分为两类,一类是换根,一类是状态表示的是一棵子树的信息。

tip

树的直径

注意,树的直径可以属于节点选择类别(指对于每个节点求向下最深的两条链)

如果不是这种做法,而是两次dfs,无法处理负权值的情况。

树的中心定义

树的直径

适用范围很小,但是很特殊,所以放到这个专题。

树上最长路

就是对于直径上的点进行特殊处理。由于每个点只会搜到一次,所以是线性的。

acwing351-树网的核

关于直径的性质分析,接下来本质上是对于直径两端点的分析。

bb

一道AT题,是有要求是好树的限制下的直径max。我们先尝试构造,然后通过组合数进行求解。

半树问题

此题要考虑每条边的贡献,然后要让边的贡献最多,就需要选择直径。

换根

母题1

以及 https://www.luogu.com.cn/problem/P3478

考虑先求一个点的答案,然后对于向它的孩子进发,那么到它的孩子子树变近,其余变远。

考虑方式:父亲与孩子的变化

变式

本题需要用到正难则反的思想,求直的情况,发现只要求出树上两两路径总和,在经过几步组合数变换即可。可以用母题的方法除二直接求解。

子树信息/选择节点类

母题:

考虑令 \(f[i][0/1]\) 表示对于 \(i\) 不选/选,子树 \(i\) 的答案。

若选,那么子节点都不选。

若不选,子节点无所谓,取选/不选较大值。

变式

状态同上,表示的是从 \(i\) 到其父亲的边选择情况,且答案不包括那条边。关键在于转移。

首先发现若为 \(f[i][0]\),那么其子节点都可不选,然后我们可以贪心的替换成选的。若是 \(f[i][1]\) 少一个(若度为0答案标记为不存在)。

贪心替换需要从大到小排序,或者找第 \(k\) 个数。

需要用到快速排序/快速选择算法

51nod-2366-砍树

直接考虑拆绝对值,每个点维护两个值,贪心的只选取非零子树。

基环树类

严格上不能算,但是需要先用树形 DP,然后再对环上的点进行特殊的处理。

1

本题先使用树的直径(可用树形 DP,分别处理每个点向下的非严格次长/最长深度)处理掉没有越过环的情况。然后对于环上的点,可以处理到达的最深深度,然后用前缀和处理距离,用单调队列查询在下标范围内的答案。

2

母题的变式,变成了基环树。考虑断掉环上的一边,然后进行特殊处理再树形 DP

3

类似于2,但是树形 DP 的转移可以参考子树信息—变式(贪心)的做法。

树上背包类

参见链接即可。


规律

如果是三种分类法参考那篇博客。
树的直径相关题目(待修复):https://i.cnblogs.com/posts?search=树的直径&page=1
树形DP题单(再做一些加深总结):https://www.luogu.com.cn/training/349260#problems

发现状态的表示无非是单个点为根的答案或子树的答案,然后记录一些特殊的属性(选择情况、选择个数)。

树形 DP 可能作为算法的一部分

基环树的分成处理环上或断环。

考虑选取一个连通块使得什么最大,就是直接考虑每个根节点为根的子树,以及它的子节点的子树的连通块选择情况。

还有部分小技巧(贪心)

特征

一般要求在线性时间复杂度内解决问题,而且某个节点与其子节点有密切的联系,亦或是某个点的父亲与当前点的答案只有极少的不同。其中除基环树外,其他需要密切关注。

posted @ 2023-08-31 09:07  wscqwq  阅读(7)  评论(0编辑  收藏  举报