dp演算法 poj 4117 簡單的整數劃分問題

2022-05-27 01:21:09 字數 1007 閱讀 1603

總時間限制: 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喜歡滑雪百這並不奇怪,因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,...