629. K Inverse Pairs Array

Problem


Tags: Dynamic Programming

For an integer array nums, an inverse pair is a pair of integers [i, j] where 0 <= i < j < nums.length and nums[i] > nums[j].

Given two integers n and k, return the number of different arrays consist of numbers from 1 to n such that there are exactly k inverse pairs. Since the answer can be huge, return it modulo 10^9 + 7.

Example 1:

Input: n = 3, k = 0
Output: 1
Explanation: Only the array [1,2,3] which consists of numbers from 1 to 3 has exactly 0 inverse pairs.

Example 2:

Input: n = 3, k = 1
Output: 2
Explanation: The array [1,3,2] and [2,1,3] have exactly 1 inverse pair.

Constraints:

  • 1 <= n <= 1000
  • 0 <= k <= 1000

Code

JS

// 629. K Inverse Pairs Array (7/2/53435)
// Runtime: 96 ms (85.71%) Memory: 53.04 MB (85.71%) 

/**
 * @param {number} n
 * @param {number} k
 * @return {number}
 */
var kInversePairs = function(n, k) {
    // dp[x][y] 代表在長 x 時有 y 個 inverse pair 的陣列有多少個
    let dp = Array.from(new Array(n+1), () => new Array(k+1).fill(0));
    
    // 如果都沒有 inverse pair 就只有可能是嚴格遞增的那種
    for(let i = 0; i <= n; i++) dp[i][0] = 1;
    
    for(let i = 1; i <= n; i++) {
        for(let j = 1; j <= k; j++) {
            dp[i][j] = (dp[i][j - 1] + dp[i - 1][j]) % (1e9 + 7);
            if(j >= i) dp[i][j] = (dp[i][j] - dp[i - 1][j - i] + (1e9 + 7)) % (1e9 + 7);
        }
    }
    
    return dp[n][k];
};