### 793. K Inverse Pairs Array



题目:
https://leetcode.com/problems/k-inverse-pairs-array

难度:
Hard

题意：

1. 给定一个数n和一个数k
2. 求n个元素，逆序对数等于k的序列数

思路：

- 最容易想到的是动态规划
- 我们一个数一个数丢进去，假设已经存在n-1个元素的序列，我们要放一个比他们都小的数，这时候根据插入的位置不同就会产生0到(n-1)的逆序对数
- 设`dp[n][k]`表示n个元素，逆序对数等于k的序列数，有状态转移方程`dp[n][k]=sum{dp[n-1][k - (0..(n-1))]}`
- 如果直接求的话，复杂度是o(n^3)
- 注意观察算`dp[n][k]`，用到的是`dp[n-1][k]`到`dp[n-1][k-(n-1)]`，算`dp[n][k-1]`，用到的是`dp[n-1][k-1]`到`dp[n-1][k-1-(n-1)]`，于是我们可以保存这个和，然后算`dp[n][i]`的时候只需要加一个数减一个数就可以维护这个和
- 复杂度是o(n^2)

解法：

```c++
#include<cstdio>
#include<cstring>

class Solution {
public:
    int a[1001][1001];
    int MOD = 1000000007;
    int kInversePairs(int n, int k) {
        memset(a, 0, sizeof(a));
        a[0][0] = 1;
        for (int i = 1;i <= n;i++) {
            int s = 0;
            for (int j = 0;j <= k;j++) {
                s += a[i - 1][j];
                if (s >= MOD) {
                    s -= MOD;
                }
                if (j - i >= 0) {
                    s -= a[i - 1][j - i];
                    if (s < 0) {
                        s += MOD;
                    }
                }
                a[i][j] = s;
            }
        }
        return a[n][k];
    }
};
```

