解題思路:
這是乙個整數劃分的模型:
將n劃分為k
個整數的劃分數
設dp[i][j]
為將i劃分為j
個整數的劃分數。
(1) i為不可能出現的情況,dp[i][j]=0
;(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]
。這道題是一樣的,dp[i][j]表示將i劃分成j個不同的數,與上面不同的是,這裡當i=j時我們是不處理的,即我們不能出現i=j的情況。
#include#include#includeusing namespace std;
const int maxn = 100005;
const int mod = 998244353;
int n,l,r,c,dp[2][maxn];
int main()
memset(dp[(i - 1) & 1],0,sizeof(dp[(i - 1) & 1]));
} printf("%d\n",ans);
} return 0;
}
整數劃分(劃分dp)總結
寫了幾個題發現整數劃分是一類題,而不是一道題。具體題型 1 n相同元素放入m個相同的盤子 盤子允許為空 例題 放蘋果 poj 1664設dp i j 為 j 個元素放入i個盤子轉移方程 dp i j dp i 1 j 新新增乙個盤子,盤子為空 dp i j dp i j i i個盤子 各取出乙個 2...
整數劃分問題 DP
整數劃分的定義 n m1 m2 mi 其中mi為正整數,並且1 mi n 則為n的乙個劃分。如果中的最大值不超過m,即max m1,m2,mi m,則稱它屬於n的乙個m劃分。這裡我們記n的m劃分的個數為f n,m 舉個例子,當n 5時我們可以獲得以下這幾種劃分 注意,例子中m 5 5 5 4 1 3...
整數劃分 劃分數(DP動態規劃)
給你乙個正整數n,讓你計算出n的m劃分有幾種方法。思路 定義dp i j 為i的j劃分,即將i劃分為j個數字之和的方案數。1 當j i時,此時,劃分個數不超過i,此時是正常的劃分。劃分的結果一定只有兩種型別 一種是j個數字,都大於0。另一種是有0,即不夠劃分j個,用0來湊的。j個數字中存在0的,其實...