遇到数排列问题的几种思考方向
一、插入法
在\(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
0da9584f5350 7 月前
561e37f800d6 7 月前