前言
板刷一个树形 DP 题单。
笔记
动态规划并没有统一的套路,只有部分相似的思想。
CF219D Choosing Capital for Treeland
有向边,可翻转,要求翻转后以某点为根可走到任一点。
求最少翻转步数,以及可达到最小步数的根。
一眼换根 DP,然而只是绿题。
可以发现,初始以 $1$ 为根,然后假定以 $u$ 为根,有且仅有 $1 \to u$ 的贡献发生变化,那么可以直接枚举计算。
|
|
[USACO17DEC]Barn Painting G
任意两相邻点颜色不同,那么把颜色加入状态中即可。
强制某些点选某些颜色,在过程中判断一下更改 DP 值即可。
普及水平的题目。
|
|
CF461B Appleman and Tree
每个点两个状态:黑/白。
对于一对父子 $u \to v$,两个选择:切/连。
讨论一下,转移方程自然就出来了。
|
|
CF1187E Tree Painting
选定第一个点后,选择方案就是固定的。
一次 dfs 可以统计出来以某点为根时的情况。
然后换根。
|
|
[POI2014]MRO-Ant colony
每次向下取整,那么可以对每个叶子结点计算一个可行区间。
|
|
[HEOI2013]SAO
毒瘤题。
建议查看专门的题解。
|
|
[SCOI2015]小凸玩密室
毒瘤题。
建议查看专门题解。
|
|
[SWTR-04] Collecting Coins
必须经过 $d$ 点,考虑将这个特殊的点当成根。
经过次数的限制,可以这样考虑:一个点被访问首先经过一次,然后每访问一棵子树都被经过一次,可以选择 $k - 1$ 个子树。
任意起点,可以考虑换根,那么先做以 $d$ 为根的动态规划。
定义 $f(i)$ 为到达 $i$ 点,在 $d$ 为根的意义下遍历完 $i$ 的子树可以获得的最大贡献。
选择前 $k_i - 1$ 大的子树累加即可更新。
然后考虑换根。
换完根后,多出一个父亲子树,且 $d$ 点一定在父亲子树中。
强制选择父亲子树即可,依然要选择 $k_i - 1$ 个,强制选择父亲子树后就只能选择 $k_i - 2$ 个子树了。
|
|
[COCI2014-2015#1] Kamp
一次可以载多个人,司机可以不回到起点。
做一遍树形 DP,然后换根。
司机一定停留在当前根子树中最长链的端点上,可以节约最多的距离。
动态维护最长链。
|
|
[JLOI2016/SHOI2016]侦察守卫
神奇的状态定义。
$f(u,i)$ 代表以 $u$ 为根的子树中,子树中所有关键点已经被覆盖,且还能从 $u$ 点向外覆盖距离至少为 $i$ 的点时的最小代价。
$g(u,i)$ 代表以 $u$ 为根的子树中,未被覆盖的点离 $u$ 点距离 $< i$ 时的最小代价。
那么对于 $u \to v$,有转移方程:
$f(u,i) = \min(f(v,i + 1) + g(u,i + 1),f(u,i) + g(v,i))$
前半部分是靠 $v$ 往上覆盖,后半部分是靠 $u$ 往下覆盖。
而由定义,往外覆盖 $i + 1$ 个点的代价,一定大于等于 $i$ 个的代价,因此有:
$f(u,i) = \min(f(u,i),f(u,i + 1))$
另外一边, $g(u,i) = \sum g(v,i - 1)$
意义很好理解,不赘述了,同样需要根据定义取 $\min$.
|
|
[SDOI2011]消防
可以发现,选择的路径一定在直径上。
否则假定有一个拐点,那么拐点往外,直径上的链一定是最长的。
考虑找出直径,然后在直径上,移动选择区间。
计算直径上每个点向外挂的最长链长度,然后计算选择区间中外挂最长链的长度,与区间到两端的值取 $\max$ 计算答案。
类似滑动窗口单调队列的维护方法。
|
|