思路与算法
我们可以用动态规划的方法来解决本题。
设 f[i][j]f[i][j] 表示我们使用数字 1, 2, \cdots, i1,2,⋯,i 的排列构成长度为 ii 的数组,并且恰好包含 jj 个逆序对的方案数。在进行状态转移时,我们可以考虑第 ii 个元素选取了 1, 2, \cdots, i1,2,⋯,i 中的哪个数字。
假设我们选取了数字 kk,那么数组的前 i-1i−1 个元素由 1, \cdots, k-11,⋯,k−1 以及 k+1, \cdots, ik+1,⋯,i 的某个排列构成。数组中的逆序对的个数可以看成如下的两部分之和:
数字 kk 与前 i-1i−1 个元素产生的逆序对的个数;
前 i-1i−1 个元素「内部」产生的逆序对个数。
对于第一部分而言,我们可以求出:数字 kk 会贡献 i-ki−k 个逆序对,即 k+1, \cdots, ik+1,⋯,i 与 kk 分别产生一个逆序对。