树形 DP 状态设计一网打尽!

浅谈树形 DP 的状态设计

连通块

主要和树上背包相关。

\(f_{i, j}\) 表示以 \(i\) 为根,\(j\) 通常和连通块有关。

P8867 [NOIP2022] 建造军营

边双缩点之后设计 \(f_{i, j}\) 表示以 \(i\) 为根,\(j\) 表示 \(i\) 子树里面是否存在军营,这影响了守卫边的方案数。

完整题解

P9745 「KDOI-06-S」树上异或

设计 \(g_{i}\) 表示 \(i\) 子树的答案,\(f_{i, j, 0/1}\) 表示 \(i\) 子树里和 \(i\) 相连的连通块在第 \(j\) 位上异或和为 \(0/1\) 的答案,转移合并儿子的 DP,如果断边就要计算上子树里的答案 \(g_v\),否则从 \(f\) 转移。

完整题解

P4516 [JSOI2018] 潜入行动

设计 \(f_{i, j, 0/1, 0/1}\) 表示以 \(i\) 为根,\(j\) 子树里面用了 \(j\) 个监视器,\(i\) 是否用了监视器,\(i\) 是否被监视。

注意这种 \(j\le \min(k, sz_i)\) 的背包,时间复杂度是 \(O(nk)\) 的,证明如下:

证明:考虑 DFN 上两个子树的合并,他们在 DFN 上一定相邻,钦定 认为一次合并是把左子树的最靠右的 \(k\) 个和右子树最靠左的 \(k\) 个合并,所以只有序列上距离不超过 \(2k-1\) 的点对之间可能有贡献。
所以总复杂度是 \(O(nk)\) 的。

P4657 [CEOI 2017] Chase

首先设计基础的 DP,\(f_{i, j,0/1}\) 表示 \(i\) 子树里用了 \(j\) 个磁铁的最大价值,\(i\) 是否用磁铁,然后可以换根做。

树的直径

\(f_{i}\) 表示以 \(i\) 开始,子树内的最长路径,合并儿子的时候,合并当前儿子和之前儿子的路径,和点分治相似。

P4657 [CEOI 2017] Chase

\(f_{i, j, 0/1}\) 表示 \(i\) 走到子树内,用了 \(j\) 个磁铁,\(i\) 是否用了磁铁,\(g_{i, j, 0/1}\) 表示从子树里向外走走到 \(i\)

转移的时候顺便处理一条链,分别有从当前儿子到之前儿子,和从之前儿子到当前儿子两种情况。

CF490F Treeland Tour

\(f_{u}\) 表示 \(u\) 子树内,以 \(u\) 为结尾的 LIS 长度,\(g_u\) 表示 LDS 的长度,转移的时候要合并 \(u\in a, v\in b, w_u< w_v\) 的答案,用线段树合并维护,类似 P5298 [PKUWC2018] Minimax,合并的时候考虑左右子树之间的贡献。

点对

CF70E Information Reform

考虑状态设计 \(f_{u, i}\) 表示考虑 \(u\) 子树内点的贡献,且距离 \(u\) 最近的点是 \(i(i\in \text{subtree}_u)\)\(g_{u, i}\) 表示考虑 \(u\) 子树内点的贡献,且距离 \(u\) 最近的点是 \(i(i\notin \text{subtree}_u)\),辅助数组 \(F_u = \min_i f_{u, i}\)

完整题解

U405411 寄

状态设计同上

posted @ 2025-10-17 16:09  MoyouSayuki  阅读(17)  评论(0)    收藏  举报
:name :name