LeetCode 629 K個逆序對陣列

2022-06-23 07:33:11 字數 803 閱讀 3149

略。首先,1~n 這 n 個數所能產生的最大逆序對為 n * (n - 1) / 2 對。

設 dp[i][j] 表示 1~i 能產生 j 對逆序對的排列種數。

這裡定義一下如果下標為負數,這一項為 0

在考慮接下來乙個事實:對於序列 1,2,3,4,5 和 2,5,7,9,10,在這個問題下,我可以說這兩個序列是等價的,因為產生逆序對的本質是大小關係而不是數實際的大小。

現在考慮狀態轉移方程。

首先當 j > i * (i - 1) / 2 時,dp[i][j] = 0。

其次當 j = 0 時,dp[i][0] = 1,只有順著排一種方法。

以上確定了初始狀態。

對於其他 dp[i][j],我們如果考慮在隊頭放第 k 大的數,那麼這個數就貢獻了 k - 1 對逆序對,剩下的 i - 1 個不同的數就可以轉化為子問題,也就是 dp[i - 1][j - k]。

同理我們也可以在隊頭放其他數,分別求一下貢獻,就能得到狀態轉移方程:$$dp[i][j] = \sum_^ dp[i - 1][k]$$

仔細觀察前後兩項的關係可以發現:$$dp[i][j] = dp[i][j - 1] + dp[i - 1][j] - dp[i - 1][max(0, j - i + 1) - 1]$$

不過不推這個式子也能做,搞個字首和即可。

1

class

solution 15}

1617

return

dp[now][k];18}

19 };

view code

Leetcode 629 K個逆序對陣列

給出兩個整數 n 和 k,找出所有包含從 1 到 n 的數字,且恰好擁有 k 個逆序對的不同的陣列的個數。逆序對的定義如下 對於陣列的第i個和第 j個元素,如果滿i j且 a i a j 則其為乙個逆序對 否則不是。由於答案可能很大,只需要返回 答案 mod 109 7 的值。示例 1 輸入 n 3...

Leetcode 629 K個逆序對陣列 C

給出兩個整數 n 和 k,找出所有包含從 1 到 n 的數字,且恰好擁有 k 個逆序對的不同的陣列的個數。逆序對的定義如下 對於陣列的第i個和第 j個元素,如果滿i j且 a i a j 則其為乙個逆序對 否則不是。由於答案可能很大,只需要返回 答案 mod 109 7 的值。示例 1 輸入 n 3...

629 K個逆序對陣列

給出兩個整數 n 和 k,找出所有包含從 1 到 n 的數字,且恰好擁有 k 個逆序對的不同的陣列的個數。逆序對的定義如下 對於陣列的第i個和第 j個元素,如果滿i j且 a i a j 則其為乙個逆序對 否則不是。由於答案可能很大,只需要返回 答案 mod 109 7 的值。示例 1 輸入 n 3...