51nod 1201 整數劃分 超級好的DP題目

2021-07-05 11:07:33 字數 998 閱讀 3693

1201 整數劃分

基準時間限制:1 秒 空間限制:131072 kb 分值: 80 

難度:5級演算法題

將n分為若干個不同整數的和,有多少種不同的劃分方式,例如:n = 6, ,共4種。由於資料較大,輸出mod 10^9 + 7的結果即可。

input

輸入1個數n(1 <= n <= 50000)。
output

輸出劃分的數量mod 10^9 + 7。
input示例

6
output示例

4
這個dp想得真叫我累啊,還想不出來。後來問了夾克老師,發現這個dp真是經典啊。

用dp[i][j]表示j個數組成i的個數。那麼對於dp[i][j]每乙個j來說,注意是對於每乙個j來說,**就是兩個,乙個就是插入j時的dp[i-j][j-1]個數。

然後就是因為要不同整數,不同的**在**,就是將[i-j][i](其含義是i個數組成了i-j)中的每乙個數加1,這點這是奇妙啊,就組成了dp[i][j]的剩餘部分。

所以dp[i][j]=dp[i-j][j]+dp[i-j][j-1]

這個題真是好題。

**:

#include #include #include #include #include #include #pragma warning(disable:4996)

using namespace std;

const int maxn = 50000 + 100;

const int mod = 1e9 + 7;

int dp[maxn][350];

int main()

} int ans = 0;

for (int i = 1; i<350; i++)

ans = (ans + dp[n][i]) % mod;

cout << ans << endl;

return 0;

}

51nod 1201 整數劃分

將n分為若干個不同整數的和,有多少種不同的劃分方式,例如 n 6,共4種。由於資料較大,輸出mod 10 9 7的結果即可。1 n 50000 直接一看就想到是一道最簡單揹包問題 但n 50000 然後我就直接上揹包,結果毫無疑問的超時,然後我的乙個夥伴在打二維揹包暴力時手抖打錯打出了正解 我們設f...

51nod 1201 整數劃分

1201 整數劃分 基準時間限制 1 秒 空間限制 131072 kb 分值 80 難度 5級演算法題 將n分為若干個不同整數的和,有多少種不同的劃分方式,例如 n 6,共4種。由於資料較大,輸出mod 10 9 7的結果即可。input 輸入1個數n 1 n 50000 output 輸出劃分的數...

51nod 1201 整數劃分

dp轉移方程 dp i j dp i j j dp i j j 1 dp i j 表示將i分成j個不相等的數的個數。dp i j j dp i j 表示給原先的j個數各加一 dp i j j 1 dp i j 表示給原先的j 1的數加1,再附帶個1.因為不相等的數,所以n n 1 2 5e4 5,n...