一类排列计数dp
适用于一类并不在意其具体数值,只在意其大小关系的计数问题,比如逆序对。适用面并不是很广。
此时我们可以这么考虑 dp:
设 \(f_{i}\) 表示我们考虑一个 \(1\sim i\) 的排列,满足某种性质的方案数。
转移我们考虑位置 \(i+1\) 为 \(x\),然后将前面 \(\ge x\) 的数都加一。这样就可以将 \(1\sim i\) 的排列变为 \(1\sim i+1\) 的排列了。
并且不难发现这样的加一不会影响前面已填的数的大小关系。
例题
AT_dp_t Permutation
设 \(f_{i,j}\) 表示用 \([1,i]\) 填位置 \(1\sim i\),最后一个位置填 \(j\) 的方案数。
- \(s_{i-1}\) 为
>,设 \(i-1\) 位置上填 \(k\),则 \(k\) 分为两种情况:
若 \(k<j\),不会加,且不满足 \(k>j\),无法转移。若 \(k\ge j\),会加,则满足 \(k'=k+1>j\) 即可,即 \(k\ge j\)。
所以 \(f_{i,j}=\sum\limits_{k\ge j}f_{i-1,k}\)。
- \(s_{i-1}\) 为
<,类似的,\(f_{i,j}=\sum\limits_{k<j} f_{i-1,k}\)。
Cnoi2021 未来试题
设 \(f_{i,j}\) 表示考虑前 \(i\) 个数,其逆序对数量取模 \(k\) 为 \(j\) 的方案数。
则转移枚举第 \(i+1\) 个位置是什么。如果第 \(i+1\) 个位置是 \(x\) 则对逆序对的贡献是 \(i-x+1\)。
最终答案为 \(f_n\)。
然后不难发现 \(f_{i,j}\) 影响的一定是 \(O(1)\) 个区间,差分维护即可,复杂度 \(O(nk)\)。
观察这个转移式子,可以发现:
- 对于 \(f_{i+1,p}\),它会被恰好 \(i+1\) 个 \(f_{i,j}\) 转移到。
- 当 \(i=k-1\) 时,\(f_{i,j}\) 恰好转移到了 \(f_{i+1}\) 中的每个状态,相当于全局加,所以 \(f_{k}\) 只有一个值。
于是不难发现,当 \(i\ge k\) 时,\(f_{i}\) 都只有一个值。所以当 \(i\ge k\) 时直接用这个值转移到下一个值即可。
复杂度 \(O(n+k^2)\)。
USACO21DEC HILO P
设 \(f_{i,j,HI/LO}\) 为 \([1,i+j]\) 填前 \(i+j\) 个位置,其中有 \(i\) 个 \(\le x\),\(j\) 个 \(>x\),最后一个询问的答案是 HI/LO 的方案数。
\(g_{i,j,HI/LO}\) 为所有方案的 HILO 个数之和。
考虑转移。
- 对于 \(f_{i,j,HI}/g_{i,j,HI}\),有三种情况:
- 上一个是 HI,这一个是 LO 但是被忽略了。
原有 \(i-1\) 个 \(\le x\) 的数,新的数选择 \([1,i-1]\) 都可以做到被忽略,可选 \(i-1\) 是因为原本的 \(i-1\) 加一之后会变为 \(i\),比 \(i-1\) 大。
- 上一个是 LO,这一个是 HI 且不能被忽略。
此时只能选择 \(i+1\) ,否则大了被忽略,小了就不是 HI 了。
- 上一个是 HI,这一个是 HI,是否被忽略不重要。
选择 \([i+1,i+j]\) 都可以,选择 \([1,i]\) 就不是 HI 了。
- 对于 \(f_{i,j,LO}/g_{i,j,LO}\):
- 前一个是 LO,这一个是 HI 但是被忽略了:
- 前一个是 HI,这一个是 LO 且不能被忽略:
注意这个地方要算贡献。
- 前一个是 LO,这一个是 LO,是否被忽略不重要。
初始化:\(f_{1,0,LO}=f_{0,1,HI}=1\)。
答案:\(g_{x,n-x,LO}+g_{x,n-x,HI}\)。

浙公网安备 33010602011771号