• 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
    ",ans);
        return 0;
    }
  • 相关阅读:
    chapter4.6生成器
    chapter4.4、递归
    chapter4.3、函数执行流程
    chapter4.2、函数返回值
    直接插入排序
    打印三角型的练习
    杂记
    linux top命令
    makefile 中的 := , += ,?=
    makefile中的shell语法 || Makefile中的@
  • 原文地址:https://www.cnblogs.com/AKCqhzdy/p/9766839.html
Copyright © 2020-2023  润新知