码迷,mamicode.com
首页 > 其他好文 > 详细

51nod 1201 (dp)

时间:2017-08-17 12:39:38      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:nod   i++   ++   using   output   相加   集合   scan   define   

整数划分

将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;
}

 

51nod 1201 (dp)

标签:nod   i++   ++   using   output   相加   集合   scan   define   

原文地址:http://www.cnblogs.com/jianrenfang/p/7380352.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!