遇到数排列问题的几种思考方向



一、插入法

在\(DP\)的过程中考虑向当前排列加入一个元素,计算新加元素的贡献。

最简单的应用就是求长度为\(n\)逆序对数为\(k\)的排列数:​​Luogu2513​

在很多较为复杂的问题中,排列的相邻元素会产生一定的贡献,此时可以考虑给\(DP\)多记一维状态,表示当前有\(j\)个相邻的数满足或不满足某限制,在转移时就要考虑加数是加在这\(j\)个空中,还是另外的\(i+1-j\)个空中。

例题1:​TopCoder-11213​

此题的思路是首先计算当排列确定时的方案数,可以用插板法解决。接着\(DP\)计算满足\(\sum_{i=2}^{n}\max(r_{p_i},r_{p_{i-1}})=k\)的方案数。先按\(r\)递增排序,设\(F[i,j,k]\)表示长度为\(i\)的排列,有\(j\)个区间还未确定(确定指的就是相邻的两个数之间不能再加数了),当前的权值\(=k\)的方案数,转移只需讨论数加在首尾或中间未确定的区间即可。

例题2:​CF840C​

删去平方因子后,\(a\times b\)是完全平方数等价于\(a=b\)。将数从小到大排序,设\(F[i,j,k]\)表示长度为\(i\)的排列,有\(j\)个相邻位置是相等的数,其中有\(k\)个相邻位置是和\(i\)的数相等的,转移比较显然。

二、合并法

在\(DP\)的过程中考虑在当前排列的最值处合并两个排列,计算贡献。

例题:​CF1580B​

三、转化法

在一些问题中我们可以把排列转化到一种划分上,从而就只需要数划分就够了。

例题:​AGC054B​