思路:设f[i][j]表示使用数字1~i的排列构成长度为i的数组,并且恰好包含j个逆序对。考虑第i个元素为数字k,则i与前面所有数均不形成逆序对,与后面的所有数均形成逆序对,对于i所形成的逆序对的数量为(i-1)-k,则还剩下与i无关的逆序对数量为j-(i-1)-k,可由f[i-1][x]得出。
代码:
class Solution {
int mod = (int)1e9+7;
public int kInversePairs(int n, int k) {
int[][] f = new int[n + 1][k + 1];
int[][] sum = new int[n + 1][k + 1];
f[1][0] = 1;
Arrays.fill(sum[1], 1);
for (int i = 2; i <= n; i++) {
for (int j = 0; j <= k; j++) {
f[i][j] = j < i ? sum[i - 1][j] :
(sum[i - 1][j] - sum[i - 1][j - (i - 1) - 1] + mod) % mod;
sum[i][j] = j == 0 ? f[i][j] : (sum[i][j - 1] + f[i][j]) % mod;
}
}
return f[n][k];
}
}