[状压] P4484 [BJWC2018] 最长上升子序列
posted on 2023-12-13 08:54:51 | under 题集 | source
考虑怎么生成排列,有一种套路:将元素从小到大依次插入序列,比如 \(132\) 插入 \(4\) 就有 \(4132,1432...\) 共四种情况。
好处是新插入的元素一定大于先前所有元素,相当于多了一条性质,这在 插入法dp 里也是很有用的。
容易发现,在下标 \(j\) 右边插入新元素 \(i\) 后,以 \(1...i-1\) 结尾的 \(\rm LIS\) 长度都不会变,而 \(i\) 结尾的 \(\rm LIS\) 长度就是 \(LIS_j+1\)!
但是还是需要枚举全排列,所以必须对它进行压缩。显然 \(LIS_i-LIS_{i-1}\le1\),那么不妨对其差分,差分数组 \(d_i=LIS_i-LIS_{i-1}\),再对差分数组状压,\(f_S\) 记为满足差分数组压缩为 \(S\) 的排列数量。
结合上述讨论,不难得到插入新元素 \(i\) 后差分数组的变化,这相当于在 \(j\) 右边插入一个 \(1\),并且将原数组中离 \(j\) 最近的且在 \(j\) 右边的 \(1\) 变成 \(0\)。
有点扯淡?举个例子:在原排列中下标 \(2\) 的后面插入新元素,假如原来差分数组是 \(11001\),那么就会变成 \(100101\)。位运算处理一下即可。
复杂度 \(O(n^22^n)\),但是这道题 \(n\le28\),直接写过不了怎么办?
打表啊!
提交记录

浙公网安备 33010602011771号