dp套dp
这类东西往往是内层的 dp 作为一个隐式的 DFA,然后往往可以利用前缀 min/max 或者差分之类的分析出差分数组 0/1 的性质,然后状压直接将内层的 dp 数组压成外层计数的一维,并在外层计数时更新内层的 dp。
例如,AC 自动机上 dp 可看成内层是一个显式的 DFA 的 dp套dp。
P4590 [TJOI2018]游园会
\[LCS(i+1,j)=\begin{cases}LCS(i,j-1)+1\ (c=B_j)\\\max\{LCS(i,j),LCS(i,j-1)\}\end{cases}
\]
其中 \(c\) 为当前第 \(i+1\) 位兑奖串我所选择的字符。
例如本题,我们在计数的时候例如固定了 \(i\),即兑奖串的长度,向 \(i+1\) 转移的过程中,显然我们内层的 LCS 只需要上一层的 LCS 数组,以及当前所填的字符即可转移。但是直接压整个 LCS 数组是困难的!考虑差分后 \(d_i\in\{0,1\}\) 那么我们就可以压这个差分数组,之后大力转移出来即可。
P4484 [BJWC2018]最长上升子序列
构造排列有 2 种常用的。
-
从序列的第一位到最后一位逐位进行构造。但很鸡肋!因为我们没办法知道当前哪些数已经被使用过了。
-
按某种顺序逐个加入数,并考虑当前加入的数要插入到哪里!
那么考虑这题,你直接加,发现内层 LIS 的转移需要一个前缀 max,又因为前缀 max 的差分 0/1,因此你直接压,大力转移即可。
需要打表。