總時間限制: 100ms 記憶體限制: 65536kb
描述將正整數n 表示成一系列正整數之和,n=n1+n2+…+nk, 其中n1>=n2>=…>=nk>=1 ,k>=1 。
正整數n 的這種表示稱為正整數n 的劃分。正整數n 的不同的劃分個數稱為正整數n 的劃分數。
輸入標準的輸入包含若干組測試資料。每組測試資料是乙個整數n(0 < n <= 50)。
輸出對於每組測試資料,輸出n的劃分數。
樣例輸入
5樣例輸出7提示
5, 4+1, 3+2, 3+1+1, 2+2+1, 2+1+1+1, 1+1+1+1+1
通過尋找子問題確定狀態,設f[i][j]表示整數i的劃分數,其中每種劃分的最大的數為j。
可以這麼理解,如果要將乙個整數n 劃分,首先要選第乙個小於等於n 的數作為劃分中第乙個
數,不妨按照從大到小的順序來選,那麼第乙個選的數作為整個劃分中最大的數,如果選擇j為
這次劃分中最大的數,那麼剩下的子問題就變成f[i - j][j],就是求 i - j 的劃分數,因為
f[i][j]中限制了接下來的劃分中最大的數不超多j並且可以取到j,所以子問題就可以用f[i - j][j]
表示,但是如果不選擇j作為這次劃分中最大的數,那就選擇j - 1作為劃分中最大的數,子問題
就定義為f[i][j - 1].由此得來狀態轉移方程:
1, i = 1 || j = 1
f[i][j - 1] + f[i - j][j] ,i > j
f[i][j] = f[i][j - 1] + 1, i = j
f[i][i] , i < j
再說說第三行 當 i = j 的情況,將乙個整數劃分為這個整數本身只有一種劃分,後邊的加一就是這麼來的。
**:
#include #include int dp[60][60];
int n;
int main()
}printf("%d\n", dp[n][n]);
}}
POJ 4117 簡單的整數劃分問題
總時間限制 100ms 記憶體限制 65536kb 描述 將正整數n 表示成一系列正整數之和,n n1 n2 nk,其中n1 n2 nk 1 k 1 正整數n 的這種表示稱為正整數n 的劃分。正整數n 的不同的劃分個數稱為正整數n 的劃分數。輸入 標準的輸入包含若干組測試資料。每組測試資料是乙個整數...
poj 幾道簡單的dp題
題意 求使數列程先遞增後遞減的形式需要去掉的數字個數。當然也可以直接遞減或者只遞減不遞增。分析 用最長遞增子串行的方法求,然後列舉兩個起點的位置即可。include include include using namespace std const int inf 1e8 const int n 1...
poj 1088 滑雪 簡單的記憶化搜尋 dp
我刷的第一道poj題。滑雪time limit 1000ms memory limit 65536k total submissions 92919 accepted 35150 description michael喜歡滑雪百這並不奇怪,因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,...