51nod 1201 (dp)

整数划分

将N分为若干个不同整数的和,有多少种不同的划分方式,例如:n = 6,{6} {1,5} {2,4} {1,2,3},共4种。由于数据较大,输出Mod 10^9 + 7的结果即可。
 
Input
输入1个数N(1 <= N <= 50000)。
Output
输出划分的数量Mod 10^9 + 7。
Input示例
6
Output示例
4
【分析】注意到划分后,每个集合里数的个数不超多350个,然后考虑dp[i][j]表示将数字i化成j个数相加,
然后将这j个数每个数+1,即可得到数字i+j,若将这j个数+1,在添加一个 “1”,即可得到i+j+1。
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define met(a,b) memset(a,b,sizeof a)
#define pb push_back
#define mp make_pair
#define rep(i,l,r) for(int i=(l);i<=(r);++i)
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int N =5e4 + 50;;
const int M = 17;
const int mod = 1e9+7;
const int mo=123;
const double pi= acos(-1.0);
typedef pair<int,int>pii;
int n;
int dp[N][350];
int main(){
    scanf("%d",&n);
    dp[1][1]=1;
    for(int i=1; i<350; i++){
        for(int j=1; j<=n; j++){
            if(i+j<=n)dp[i+j][i]=(dp[i+j][i]+dp[j][i])%mod;
            if(i+j+1<=n&&i+1<350)dp[i+j+1][i+1]=(dp[i+j+1][i+1]+dp[j][i])%mod;
        }
    }
    int ans=0;
    for(int i=1; i<350; i++)ans=(ans+dp[n][i])%mod;
    cout<<ans<<endl;
    return 0;
}

 

posted @ 2017-08-17 10:40  贱人方  阅读(164)  评论(0编辑  收藏  举报