給出兩個整數 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 個逆序對。
再往其中新增乙個數字5有如下幾種新增方式:
第一種:***x5
多出0個逆序對,因此有:f1(5,k)=f(4,k)
第二種:***5x
多出1個逆序對,因此有:f2(5,k+1)=f(4,k)=> f2(5,k)=f(4,k-1)
第三種:xx5xx
多出1個逆序對,因此有:f3(5,k+2)=f(4,k)=> f3(5,k)=f(4,k-2)
第四種:x5***
多出1個逆序對,因此有:f4(5,k+3)=f(4,k)=> f4(5,k)=f(4,k-3)
第五種:5***x
多出1個逆序對,因此有:f5(5,k+4)=f(4,k)=> f5(5,k)=f(4,k-4)
=> f(5,k) = f1 + f2 + f3 + ... + f5
=> f(5,k) = f(4,k) + f(4,k-1) + f(4,k-2) + f(4,k-3) + f(4,k-5+1)
=> f(n,k) = f(n-1,k)+f(n-1,k-1) + f(n-1,k-2) + f(n-1,k-3) + ... + f(n-1,k-n+1)
=> f(n,k+1) = f(n-1,k+1) + f(n-1,k-1) + f(n-1,k-2) + ... + f(n-1,k-n+2)
=> f(n,k+1) - f(n,k) = f(n-1,k+1) - f(n-1,k-n+1)
=> f(n,k+1) = f(n,k) + f(n-1,k+1) - f(n-1,k-n+1)
=> f(n,k) = f(n,k-1) + f(n-1,k) - f(n-1,k-n)
兩個遞推公式:
f(n,k) = f(n-1,k)+f(n-1,k-1) + f(n-1,k-2) + f(n-1,k-3) + … + f(n-1,k-n+1)
f(n,k) = f(n,k-1) + f(n-1,k) - f(n-1,k-n)
class
solution
//開始動態規劃
求陣列逆序對數
題目 對於乙個元素個數為n的陣列a,若 a i a j 且0 i j n,則a i 和a j 為乙個逆序對。現在要求給定陣列的逆序對數 解析 對於這乙個題目,最容易想到的方法即順序掃瞄整個陣列。沒掃瞄到乙個元素,則將該元素與其後面的所有元素進行比較,若後面的元素比該元素大,則找到乙個逆序數。這一過程...
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 的值。解題思路 思...