900. 整数划分

发布时间:2024年01月16日
#include<bits/stdc++.h>
using namespace std;

const int N =1010;
const int mod=1000000007;

int f[N][N];

int main()
{
    int n;
    cin>>n;
    
    f[1][1]=1;
    for(int i=2;i<=n;i++)
    {
        for(int j=1;j<=i;j++)
        {
            f[i][j]=(f[i-1][j-1]+f[i-j][j])%mod;
        }
    }
    
    int res=0;
    for(int i=1;i<=n;i++)   res=(res+f[n][i])%mod;
    
    cout<<res<<endl;
    
    return 0;
}

计数类dp:f数组的含义是,总和是i,用j个数字来组成这个总和,首先初始化,初始化的意思是,总和是1,用一个数,有一种情况,1,然后是状态计算

状态计算:分成两种情况,分类标准是j个数字里面有没有数字1,如果有数字1,把总和减去1,数字个数减去1,数组的数值是没有发生变化的

另外一种情况是j个数字里面没有数字1,每一个数字都严格大于1,那么把每一个数字都减小1,数字个数不变,总和就减小了j,数组的数值也没有发生改变

最后把f[n][i]求和就是答案

所以就是,定义数组,初始化数组,状态计算

文章来源:https://blog.csdn.net/L3102250566/article/details/135624821
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。