• 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;
    }
  • 相关阅读:
    shell 中"${b2}" and "${b:2}"
    关于 libpcap的安装
    ubuntu adsl 上网
    2011.1.18 运算符优先级
    Tail Queues
    fd_set struct
    读取和修改操作array 配置文件的方法
    smarty调试方法
    一个CURL例子
    cakephp数据库事务transactions
  • 原文地址:https://www.cnblogs.com/jianrenfang/p/7380352.html
Copyright © 2020-2023  润新知