题目
题解思路
状态表示
前i个数中逆序对为j个的情况数
状态转移
第i个数有可以放的位置为( 1 , i ) , 设放的位置为K ,则会产生 (i - k )个逆序对,这样i-1只需提供j-(i-k)个节点,对K的所有位置进行求和就是转移到i j的所有情况了。
这样转移方程就是
还可以进行优化,这样就可以就不用前缀和了。
AC代码
const int mod = 1e9 + 7 ;
long long dp[1010][1010] ;
class Solution {
public:
int kInversePairs(int n, int k) {
dp[0][0] = 1 ;
for (int i = 1 ; i <= n ; i++ )
{
for (int j = 0 ; j <= k ; j++ )
{
if ( j - 1 >= 0 )
{
if ( j - i >= 0 )
dp[i][j] = ( dp[i][j-1] + dp[i-1][j] - dp[i-1][j-i] + mod )%mod ;
else
dp[i][j] = ( dp[i][j-1] + dp[i-1][j] ) %mod ;
}else
dp[i][j] = 1 ;
}
}
return dp[n][k] ;
}
};