一类排列计数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_{i,j}\to f_{i+1,(j+(i-x+1))\bmod k},x\in [1,i+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}\),有三种情况:
  1. 上一个是 HI,这一个是 LO 但是被忽略了。

\[f_{i,j,HI}\gets f_{i-1,j,HI}\times (i-1) \]

\[g_{i,j,HI}\gets g_{i-1,j,HI}\times (i-1) \]

原有 \(i-1\)\(\le x\) 的数,新的数选择 \([1,i-1]\) 都可以做到被忽略,可选 \(i-1\) 是因为原本的 \(i-1\) 加一之后会变为 \(i\),比 \(i-1\) 大。

  1. 上一个是 LO,这一个是 HI 且不能被忽略。

\[f_{i,j,HI}\gets f_{i,j-1,LO} \]

\[g_{i,j,HI}\gets g_{i,j-1,LO} \]

此时只能选择 \(i+1\) ,否则大了被忽略,小了就不是 HI 了。

  1. 上一个是 HI,这一个是 HI,是否被忽略不重要。

\[f_{i,j,HI}\gets f_{i,j-1,HI}\times j \]

\[g_{i,j,HI}\gets g_{i,j-1,HI}\times j \]

选择 \([i+1,i+j]\) 都可以,选择 \([1,i]\) 就不是 HI 了。

  • 对于 \(f_{i,j,LO}/g_{i,j,LO}\)
  1. 前一个是 LO,这一个是 HI 但是被忽略了:

\[f_{i,j,LO}\gets f_{i,j-1,LO} \times (j-1) \]

\[g_{i,j,LO}\gets g_{i,j-1,LO}\times (j-1) \]

  1. 前一个是 HI,这一个是 LO 且不能被忽略:

\[f_{i,j,LO}\gets f_{i-1,j,HI} \]

\[g_{i,j,LO}\gets g_{i-1,j,HI}+f_{i-1,j,HI} \]

注意这个地方要算贡献。

  1. 前一个是 LO,这一个是 LO,是否被忽略不重要。

\[f_{i,j,LO}\gets f_{i-1,j,LO}\times i \]

\[g_{i,j,LO}\gets g_{i-1,j,LO}\times i \]

初始化:\(f_{1,0,LO}=f_{0,1,HI}=1\)

答案:\(g_{x,n-x,LO}+g_{x,n-x,HI}\)

posted @ 2025-10-12 20:23  _E_M_T  阅读(5)  评论(0)    收藏  举报