DP 套 DP 学习笔记
简介
正常的 DP 是要满足若干条件,对某个东西求最值或者计数。但是某些情况下,求的东西可能刚好是相反的。即给定值反推有多少种条件能使得最后 DP 出的答案为给定的值。
将原来的 DP 作为内层,将内层 DP 每个状态的取值作为外层 DP 的状态,在下标上进行内层 DP 来转移外层 DP。
很多情况下要观察性质或搜索,将内层 DP 不可能取到的 DP 状态剪掉,或者合并内层 DP 的状态,以达到优化复杂度的目的。
例题
P8352 [SDOI/SXOI2022] 小 N 的独立集
简要题意
给定一个 $n$ 个点的树,已知每个点的权值在 $1\sim k$ 的范围内,对于每个 $x\in[1,kn]$ 求有多少种不同的点权使得这棵树的最大权独立集的权值为 $x$。$n\le 1000,k\le 5$。
解法
经典的树上最大权独立集求法。记 $h_{u,0/1}$ 分别表示以 $u$ 为根的子树中不选 $u$ 和选 $u$ 的最大权独立集。转移 $h_{u,0}=\sum\limits_{v\in son(u)}\max\{h_{v,0},h_{v,1}\},h_{u,1}=\sum\limits_{v\in son(u)}h_{v,0}$。
考虑计数,设 $f_{u,i,j}$ 表示在 $u$ 的子树内,$h_{u,0}$ 为 $i$,$h_{u,1}$ 为 $j$ 的方案数。记 $v\in son(u)$,容易得到 $f_{u,i+\max\{k,l\},j+k}=f_{u,i+\max\{k,l\},j+k}+f_{u,i,j}\times f_{v,k,l}$。不幸的是,这个 DP 仅状态就达到了 $O(n^3k^2)$。
考虑内层 DP 的无用状态。我们发现,$h_{u,1}-k\le h_{u,0}$,原因是在选 $u$ 的方案中删除点 $u$ 必然是一个合理的不选 $u$ 的方案。所以对于所有满足 $j-k>i$ 的 $h_{u,i,j}$ 的位置必然是 $0$。还有一个观察,即在 $i>j$ 时 DP 状态是冗余的,我们发现在此时转移时不需要关心 $j$ 的值,可以省去 $j$ 这一维。记 $f_{u,i,j}$ 表示在 $h_{u,0}$ 为 $i$,$\max\{0,h_{u,1}-h_{u,0}\}$ 为 $j$ 时的方案数。状态数成功的降到了 $O(n^2k^2)$。转移与上面的类似,可以通过,时间复杂度 $O(n^2k^4)$。同时判断某个状态是否为 $0$ 可以极大地加速。
Code
1 |
|