Description
给定
Constraints
Solution
设
问题在于怎么做状态转移
如果算出
而不同位置会产生不同的逆序对,其增加的数目显然在
因此有:
而这个式子直接算的话需要
Note: 如果集合为空,则方案数设为0(
Code
class Solution {
public:
int kInversePairs(int n, int k) {
auto dp = vector<vector<long>>(2, vector<long>(k+1));
auto pre = dp;
constexpr long MOD = 1e9 + 7;
for(int i = 1; i <= n; ++i) {
dp[i & 1][0] = pre[i & 1][0] = 1;
for(int j = 1; j <= k; ++j) {
auto sum = pre[i-1 & 1][j];
if(j-i >= 0) sum -= pre[i-1 & 1][j-i];
dp[i & 1][j] = (sum + MOD) % MOD;
pre[i & 1][j] = (pre[i & 1][j-1] + dp[i & 1][j]) % MOD;
}
}
return dp[n & 1][k];
}
};