51nod 1201 整数划分

刚说完五级算法题水就被亮老师D飞

这道题其实我理解错了很多次题意。。。(一直理解成v2囧)

考虑DP,一位表示拼成什么数字跑不掉了,但是一位搞不定,考虑加一维

拼出n最大的数?好像空间不太资瓷

考虑避实就虚,开一维表示用了多少不同的数字拼出n

总的就是f[i][j]表示用i个数字拼出了j

考虑如何转移

对于这i个数字,每个都加1就可以表示出i+j啦

这样还算漏了加一个1的情况,那么对于i-1个数字,每个都加1并且在多放一个1也可以表示出i+j

所以f[i][j]=f[i][j-i]+f[i-1][j-i]

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
const int mod=1e9+7;

int f[51000][330];
int main()
{
    int n,ans=0;
    scanf("%d",&n);
    memset(f,0,sizeof(f));f[0][0]=1;
    for(int i=1;i<=320;i++)
        for(int j=i;j<=n;j++)
        {
            f[i][j]=(f[i-1][j-i]+f[i][j-i])%mod;
            if(j==n)ans=(ans+f[i][j])%mod;
        }
    printf("%d\n",ans);
    return 0;
}

 

posted @ 2018-10-10 15:43  AKCqhzdy  阅读(112)  评论(0编辑  收藏  举报