各類整數劃分之動態規劃

2021-09-10 17:09:06 字數 1263 閱讀 9946

1. 若劃分的多個整數可以相同(hdu1028)

設dp[i][j]為將i劃分為不大於j的劃分數

(1) 當i(2) 當i>j 時,可以根據劃分中是否含有j分為兩種情況。若劃分中含有j,劃分方案數為dp[i-j][j];若劃分數中不含j,相當於將i劃分為不大於j-1的劃分數,為dp[i][j-1]。所以當i>j時dp[i][j]=dp[i-j][j]+dp[i][j-1];

(3) 當i=j 時,若劃分中含有j只有一種情況,若劃分中不含j相當於將i劃分為不大於j-1的劃分數。此時dp[i][j]=1+dp[i][j-1]。

2. 若劃分的正整數必須不同

設dp[i][j]為將i劃分為不超過j的不同整數的劃分數

(1) 當i(2) 當i>j時,可以根據劃分中是否含有j分為兩種情況。若劃分中含有j,則其餘的劃分中最大只能是j-1,方案數為dp[i-j][j-1];若劃分中不含j,相當於將i劃分為不大於j-1的劃分數,為dp[i][j-1]。所以當i>j時dp[i][j]=dp[i-j][j-1]+dp[i][j-1];

(3) 當i=j時,若劃分中含有j只有一種情況,若劃分中不含j相當於將i劃分為不大於j-1的劃分數。此時dp[i][j]=1+dp[i][j-1]

3. 將n劃分為k個整數的劃分數

設dp[i][j]為將i劃分為j個整數的劃分數。

(1) i(2) 若i=j,有一種情況:i可以劃分為i個1之和,dp[i][j]=1;

(3) 若i>j,可以根據劃分數中是否含有1分為兩類:若劃分數中含有1,可以使用「截邊法」將j個劃分分別截去乙個1,把問題轉化為i-j的j-1個劃分數,為dp[i-j][j-1]; 若劃分中不包含1,使用「截邊法」將j個劃分數的最下面乙個數截去,將為題轉化為求i-j的j個劃分數,為dp[i-j][j]。所以i>j時dp[i][j]=dp[i-j][j-1]+dp[i-j][j]。

4. 將n劃分為若干正奇數之和的劃分數

設f[i][j]為將i劃分為j個奇數之和的劃分數,g[i][j]為將i劃分為j個偶數之和的劃分數。

使用截邊法,將g[i][j]的j個劃分都去掉1,可以得到f[i-j][j],所以

g[i][j] = f[i-j][j]。

f[i][j]中有包含1的劃分方案和不包含1的劃分方案。對於包含1的劃分方案,可以將1的劃分除去,轉化為「將i-1劃分為j-1個奇數之和的劃分數」,即f[i-1][j-1];對於不包含1的劃分方案,可以使用截邊法對j個劃分每乙個都去掉乙個1,轉化為「將i-j劃分為j個偶數之和的劃分數」,即g[i-j][j]。

所以f[i][j]=f[i-1][j-1]+g[i-j][j]。

動態規劃解整數劃分

演算法思路 n n1 n2 n3 n4 nk n1 n2 n3 nk 從大到小排列後,可以避免陷入數值大小排序順序的困境中。這樣,在下面的過程,我們可以並不關心數值大小的排列,只關心組合方案數。狀態表示 將最大加數n1不大於m的劃分個數記作q n,m 狀態轉移 1 q n,1 1,n 1 當最大加數...

整數劃分問題 動態規劃

原文出處 整數劃分 有以下情況 1 將n劃分成若干正整數之和的劃分數。2 將n劃分成k個正整數之和的劃分數。3 將n劃分成最大數不超過k的劃分數。4 將n劃分成若干奇正整數之和的劃分數。5 將n劃分成若干不同整數之和的劃分數。include includeconst int ns 55 int n,...

DP 動態規劃 整數劃分

時間限制 3000 ms 記憶體限制 65535 kb 難度 3 輸入第一行是測試資料的數目m 1 m 10 以下每行均包含乙個整數n 1 n 10 輸出輸出每組測試資料有多少種分法。描述將正整數n表示成一系列正整數之和 n n1 n2 nk,其中n1 n2 nk 1,k 1。正整數n的這種表示稱為...