629 K個逆序對陣列

2021-10-13 17:28:09 字數 1149 閱讀 5031

題目描述:

給出兩個整數 n 和 k,找出所有包含從 1 到 n 的數字,且恰好擁有 k 個逆序對的不同的陣列的個數。

逆序對的定義如下:對於陣列的第i個和第 j個元素,如果滿i < j且 a[i] > a[j],則其為乙個逆序對;否則不是。

由於答案可能很大,只需要返回 答案 mod 109 + 7 的值。

示例 1:

輸入: n = 3, k = 0

輸出: 1

解釋:只有陣列 [1,2,3] 包含了從1到3的整數並且正好擁有 0 個逆序對。

示例 2:

輸入: n = 3, k = 1

輸出: 2

解釋:陣列 [1,3,2] 和 [2,1,3] 都有 1 個逆序對。

說明:

n 的範圍是 [1, 1000] 並且 k 的範圍是 [0, 1000]。

方法1:

主要思路:

(1)參考題解大佬們的思路,動態規劃;

(2)dp[ i ][ j ]表示i個數時,組成 j 個逆序對時,有多少種方法,對於第 i 個數,可以在原陣列中插入不同的位置,從而增加0,1,……,i-1個逆序對,故dp[ i ][ j]=dp[i-1][j]+dp[i-1][j-1]+dp[i-1][j-2]+……+dp[i -1][ j-(i-1)];

(3)又有dp[ i ][ j - 1]=dp[i-1][j-1]+dp[i-1][j-2]+dp[i-1][j-3]+……+dp[i -1][ j-i];,則兩個式子相減有 dp[ i ][ j ]-dp[ i ][ j-1 ]=dp[i-1][ j ]-dp[ i-1 ][ j-i]; 既dp[ i ][ j ]=dp[ i ][ j-1 ]+dp[i-1][ j ]-dp[ i-1 ][ j-i];

class

solution

for(

int i=

2;i<=n;

++i)

else

dp[i]

[j]%

=1000000007;}

}return dp[n]

[k];}}

;

629 K個逆序對陣列

給出兩個整數 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 的值。解題思路 思...

629 K個逆序對陣列

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