2023.8.13 DP套DP + 动态DP
[TJOI2018] 游园会
首先很容易想到 \(f_{i, 0/1/2}\) 表示考虑兑奖串的前 \(i\) 位 \(\texttt{NOI}\)的出现情况为 \(0/1/2\) 的方案数
考虑转移 结果发现因为不知道奖章串现在匹配到了哪一位 所以不好转移
我们考虑 \(O(n^2)\) 的 \(LCS\) 求法
设 \(g_{x, y}\) 表示考虑 \(S\) 串的前 \(x\) 位 \(T\) 串的前 \(y\) 位的 \(LCS\)
那么显然有 \(g_{x, y} = max(g_{x - 1, y}, g_{x, y - 1}, g{x - 1, y - 1} + (S_x == T_y))\)
那么假如说我把这个 \(g\) 数组放到 \(f\) 数组的第三维 转移的时候考虑枚举 \(y\) 然后从 \(g\) 中转移过去不就可以了吗 因为我们把 \(g\) 拉出来就相当于我们知道了奖章串的匹配情况
进一步的 我们发现 对于同一个 \(x\) 而言 它的 \(y\) 每一位最多只差 \(1\)
又因为 \(y\) 显然只有 \(15\) 个 我们考虑将其差分 然后用 \(f_i\) 的第 \(j\) 位表示这个差分数组 那我们就可以状压这个差分数组
每次转移的时候 枚举兑奖串的第 \(i + 1\) 位 然后用状压的状态转移即可
upd:如果实在感觉难以理解的话 我的理解是将原来那个 \(g_{x, y}\) 对应到现在的 \(f_{x, ···, 第y位}\)
[NOIP2018 提高组] 保卫王国
动态 \(DP\) :黑科技 考虑将转移变成一个魔改版矩乘的形式
首先原来的 \(DP\) 很显然
然后我们考虑如何以矩乘的形式来进行转移

然后我们用重链剖分 使每个点的答案为它到它所在的重链末端的转移矩阵乘积
那么每次修改点权 我们就修改该点的 \(g\) 数组 然后修改 \(fa_{top_i}\) 的 \(g\) 数组 一直跳到根节点即可

浙公网安备 33010602011771号