排列计数dp

依赖邻项或与下标产生关联的问题

通常,连续段 dp 会对三种转移方式分类讨论:将插入的元素作为一个新连续段插入;将元素插入至一个已有连续段的两端;合并两个连续段。

CF1515E Phoenix and Computers

考虑连续段 dp。设 \(dp_{i,j}\) 为考虑前 \(i\) 台电脑,形成了 \(j\) 个连续段的操作序列数。

考虑转移。

  • 作为新的连续段:\(dp_{i,j}\times(j+1)\rightarrow dp_{i+1,j+1}\)
  • 合并两个连续段:我们可以在两个连续段中插入两个电脑并打开其中一个,也可以在两个连续段中插入三个电脑并打开中间那个电脑。即 \(dp_{i,j}\times 2(j-1)\rightarrow dp_{i+2,j-1}\)\(dp_{i,j}\times (j-1)\rightarrow dp_{i+3,j-1}\)
  • 放在连续段两端:我们可以在紧挨着连续段插入一个电脑并打开,也可以在连续段插入两个电脑并打开相隔 \(1\) 格的电脑。即 \(dp_{i,j}\times2j\rightarrow dp_{i+1,j}\)\(dp_{i,j}\times2j\rightarrow dp_{i+2,j}\)

需要判断边界情况。答案即 \(dp_{n,1}\)

CEOI 2016 kangaroo

题意可以转化为,求排列 \(P\) 的个数,使得对于 \(\forall i\in [1,n]\),与 \(i\) 相邻的元素均大于或小于 \(P_i\)\(P_1=s\)\(P_n=t\)。发现这个条件依赖邻项,可以考虑连续段 dp。

\(dp_{i,j}\) 为考虑到前 \(i\) 位,形成了 \(j\) 个连续段的合法排列数。

考虑转移。

  • 作为新的连续段:\(dp_{i,j}\times(j+1-[j>t]-[j>s])\rightarrow dp_{i+1,j+1}\)
  • 合并两个连续段:\(dp_{i,j}\times(j-1)\rightarrow dp_{i+1,j-1}\)
  • 放在连续段两端:只能放在开头或结尾的位置。但是开头、结尾的位置的元素已经被钦定了,所以不会出现这种情况。

答案即 \(dp_{n,1}\)

COCI2022 Magneti

Hint:考虑对于一种磁铁的排列顺序 \(P\),我们求出将所有磁铁尽可能紧凑地放置后的覆盖区间长度 \(\operatorname{len}(P)\),则剩余 \(l-\operatorname{len}(P)\) 个空位可以随意放置,有 \(\binom{n+l-\operatorname{len}(P)}{n}\) 种放法。考虑求出 \(\operatorname{len}(P)=x\) 的排列个数 \(g(x)\),答案即为 \(\sum\binom{n+l-i}{n}g(i)\)

考虑两个相邻的磁铁 \(i, j\),若 \(r_i > r_j\),则只需考虑 \(r_i\) 的限制。因此我们按 \(r_i\) 从小到大的顺序插入。显然当前覆盖的区间 \(l\) 是我们必须维护的状态。当我们在两端插入磁铁时,可以直接 \(l \leftarrow l+r_i\)。但当我们在两个磁铁 \(x,y\) 中间插入磁铁时,我们的 \(l\leftarrow l+2r_i-\max(r_x,r_y)\)。我们需要用到相邻的已插入元素的具体信息,于是考虑连续段 dp。

\(dp_{i,j,k}\) 表示考虑前 \(i\) 小的磁铁,形成了 \(j\) 个连续段,当前覆盖区间为 \(k\) 的磁铁排列数。

考虑转移。

  • 作为新的连续段:\(dp_{i,j,k}\times(j+1)\rightarrow dp_{i+1,j+1,k+r_{i+1}}\)
  • 合并两个连续段:\(dp_{i,j,k}\times(j-1)\rightarrow dp_{i+1,j-1,k+2r_{i+1}-1}\)
  • 放在连续段两端:\(dp_{i,j,k}\times2j\rightarrow dp_{i+1,j,k+r_{i+1}}\)

\(g(x)\)\(dp_{n,1,x}\)

THUPC2024决赛 排列游戏

咕了。

延后决策

一些信息对于当前局面不产生影响,但是会对之后决策形成的局面产生影响。这个时候利用技巧记录这些可能产生影响的信息即为延后决策。

AT_abc134_f Permutation Oddness

Hint:有一个经典 trick。注意到 \(|i-p_i|=max(i,p_i)-min(i,p_i)\),我们将 \(\{1,2,\dots,n\}\) 看成红色小球,\(\{p_1,p_2,\dots,p_n\}=\{1,2,\dots,n\}\) 看成蓝色小球。将它们按照值从小到大排序,即将红蓝小球配对,价值为排在后面的小球的值减去排在前面的小球的值,求有多少种配对方式,使得这 \(n\) 个红蓝小球对的价值和为 \(k\)

定义 \(dp_{i,x,y,s}\) 表示考虑完前 \(i\) 个球,有 \(x\) 个红色小球和 \(i\) 后面的蓝色小球配对,有 \(y\) 个蓝色小球和 \(i\) 后面的红色小球配对,且当前价值和为 \(s\) 的方案数。

考虑转移。

  • 这个是红色小球。
    • 匹配了之前的蓝色小球,\(dp_{i,x,y,s}\rightarrow dp_{i+1,x,y-1,s+v_i}\)
    • 匹配了之后的蓝色小球,\(dp_{i,x,y,s}\rightarrow dp_{i+1,x+1,y,s-v_i}\)
  • 这个是蓝色小球。
    • 匹配了之前的红色小球,\(dp_{i,x,y,s}\rightarrow dp_{i+1,x-1,y,s+v_i}\)
    • 匹配了之后的红色小球,\(dp_{i,x,y,s}\rightarrow dp_{i+1,x,y+1,s-v_i}\)

其中 \(v_i\) 表示当前球的值。答案即 \(dp_{n,0,0,k}\)。时间复杂度 \(O(n^3k)\),已经可以通过。

考虑优化。设 \(cnt_{i,0/1}\) 表示前 \(i\) 个数中红、蓝小球的个数。那么已经匹配的小球对数即 \(cnt_{i,0}-x\)。所以还没有被匹配的蓝色小球个数即为 \(cnt_{i,1}-cnt_{i,0}+x\)。于是就可以压掉一维。

时间复杂度 \(O(n^2k)\)

JROI-4 沈阳大街 2

\(\sum\limits_{\pi}\prod\limits_{i=1}^{n}min(A_i,B_{\pi_i})\)

经典小球题。将 \(A, B\) 放在一起排序,把 \(A\) 看成红色小球,\(B\) 看成蓝色小球,进行配对。

\(dp_{i,j}\) 表示考虑完前 \(i\) 个球,\(A\) 中有 \(j\) 个需要向后匹配。这是容易转移的。

CSP-S 2025 员工招聘

其实是为了这口醋包了一整盘饺子。

题意可以转化为,对于一个排列 \(p\),我们定义 \(f(p)\)

  1. 最开始 \(w=0\)
  2. 如果 \(s_i=0\),则 \(w\leftarrow w+1\)
  3. 如果 \(s_i=1\)\(c_i\le w\),则 \(w\leftarrow w+1\)
  4. 否则 \(w\) 不变。

\(f(p)\) 即为 \(n-w\)。求排列 \(p\) 的个数,使得 \(f(p)\le m\)

其他排列计数问题

ZJOI2010 排列计数

这是一个小根堆。容易发现发现一个点的左右子树中的大小关系是独立的。

我们设 \(dp_i\) 是以 \(i\) 为根的子树内合法排列数。根节点一定选择最小值。考虑剩余 \(sz_i-1\) 个点,我们要划分 \(sz_l\) 个点到左子树,\(sz_r\) 个点到右子树。即 \(dp_i=dp_l\times dp_r\times \binom{sz_i-1}{sz_l}\)

答案即为 \(dp_1\)

AT_dp_t Pemutation

插入法。

\(dp_{i,j}\) 表示在前 \(i\) 位填入 \(1\sim i\),最后一位是 \(j\) 的合法排列数。

考虑转移。假设我们要在第 \(i+1\) 位放入 \(j\),我们将 \(1\sim i\) 中所有不小于 \(j\) 的数全部加 \(1\),这样就可以保证我们填入的是一个排列。

转移方程即

\[dp_{i,j}= \begin{cases} \sum\limits_{k=1}^{j-1}dp_{i-1,k}&S_i \texttt{ 为 <}\\\\ \sum\limits_{k=j}^{i-1}dp_{i-1,k}&S_i \texttt{ 为 >} \end{cases} \]

前缀和优化即可。答案即 \(\sum dp_{n,i}\)

AT_abc282_g Similar Permutation

上一道题的加强版。

\(dp_{i,l,j,k}\) 表示在前 \(i\) 位填入 \(1\sim i\)\(A_i=j\)\(B_i=k\),相似度为 \(l\) 的合法排列数。

这样就可以很好的转移了。分别讨论 \(A_i\)\(A_{i+1}\)\(B_i\)\(B_{i+1}\) 的相对顺序即可。

二维前缀和即可。答案即 \(\sum\limits_i\sum\limits_j dp_{n,k,i,j}\)

posted @ 2026-03-16 10:40  jeffreyli2025  阅读(4)  评论(0)    收藏  举报