題目描述:
給出兩個整數 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....