51nod 1201 整數劃分 dp

2021-07-25 17:22:10 字數 1275 閱讀 4482

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
乙個比較好的思維了  

比如 組成1的 只有 1 

組成 2 的  有  2 

組成3 的 有 1 2   和 3

組成 4 的 有  1 3  和 4

組成5 的   {1,4}  

組成6 的  {1,5}{2,4}{1,2,3} {6}

組成7的  {1,6} {2,5}{3,4} {1,2,4}{7}

然後得出

dp[i][j]=(dp[i-j][j-1]+dp[i-j][j])%mod;
dp[i][j],表示j個數組成值為i的方法數

乙個是關於由{1,2,3} 變成{2,3,4} 這樣的

dp[i-j][j]  由和為i-j 把j個數字每個位置加1得到的
乙個是關於  例如 {1,3} 變成{1,2,4}  這個是

dp[i-j][j-1] 的 由j-1個數字  把j個位置上每個數加1得到的

#include#include#include#includeusing namespace std;

int dp[50005][370];

long long mod=1000000007;

int main()

{ memset(dp,0,sizeof(dp));

dp[1][1]=1;

dp[2][1]=1;

dp[3][1]=1;

dp[3][2]=1;

int n;

cin>>n;int x=0;

for(int i=4;i<=n;i++)

{for(int j=1;j<=350;j++)

{dp[i][j]=(dp[i-j][j-1]+dp[i-j][j])%mod;//這個很明了

// cout<

51nod 1201 整數劃分 dp

題解 顯然是一道dp,不妨設dp i j 表示數字i分成j個一共有幾種分法。那麼轉移方程式為 dp i j dp i 1 j dp i 1 j 1 表示將i 1劃分為j個數,然後j個數都 1 還是不重複,將i 1劃分為j 1個數,然後j 1個數都 1,再加上1這個數。然後就是j的範圍要知道1 2 3...

整數劃分 51Nod 1201 (經典dp)

將n分為若干個不同整數的和,有多少種不同的劃分方式,例如 n 6,共4種。由於資料較大,輸出mod 10 9 7的結果即可。input 輸入1個數n 1 n 50000 output 輸出劃分的數量mod 10 9 7。sample input 6sample output 4這道題 剛寫的時候 使...

51Nod 1201 整數劃分 經典dp

題意不多說了。dp i j 表示i這個數劃分成j個數的情況數。dp i j dp i 1 j dp i 1 j 1 前者表示將i 1劃分為j個數,然後j個數都 1 還是不重複 後者表示將i 1劃分為j 1個數,然後j 1個數都 1,再加上1這個數 普通的dp是n 2的,但是可以發現1 2 m n 1...