629_K個逆序對陣列_2021.11.11(困難)
阿新 • • 發佈:2021-11-11
給出兩個整數n和k,找出所有包含從1到n的數字,且恰好擁有k個逆序對的不同的陣列的個數。
逆序對的定義如下:對於陣列的第i個和第j個元素,如果滿i<j且a[i]>a[j],則其為一個逆序對;否則不是。
由於答案可能很大,只需要返回 答案 mod 109+ 7 的值。
不會做,直接學習題解程式碼:
1 class Solution { 2 private: 3 static constexpr int mod = 1000000007; 4 5 public: 6 int kInversePairs(int n, int k) { 7 vector<vector<int>> f(2, vector<int>(k + 1)); 8 f[0][0] = 1; 9 for (int i = 1; i <= n; ++i) { 10 for (int j = 0; j <= k; ++j) { 11 int cur = i & 1, prev = cur ^ 1; 12 f[cur][j] = (j - 1 >= 0 ? f[cur][j - 1] : 0) - (j - i >= 0 ? f[prev][j - i] : 0) + f[prev][j]; 13 if (f[cur][j] >= mod) { 14 f[cur][j] -= mod; 15 } 16 else if (f[cur][j] < 0) { 17 f[cur][j] += mod; 18 } 19 } 20 } 21 return f[n & 1][k]; 22 }23 };