Mashmokh and ACM(Codeforces Round #240)

来源:互联网 发布:python 贝叶斯分类器 编辑:程序博客网 时间:2024/05/16 15:09

又是DP没做出来。。饮恨!!明明已经想到状态转移了,却因为对时间复杂度的估计错误而错过了,又一次犯这样的错误!


题库链接:http://codeforces.com/problemset/problem/414/B

题意:求 不同的 长度为k的单调非递减序列的 数量,其中所有元素不大于n,且前一个元素能够整除后一个元素

思路:记d[i][j]为一个序列中第i项为j的情况。分析题意可知,元素Bi的可能取值只与Bi-1(第i-1个元素)有关,Bi只能是Bi-1的倍数且取值不超过n

            则状态转移方程为:d[i][z]=d[i][z]+d[i-1][j]                -----------(z是j是倍数)


代码如下:

#include <iostream>#include <cstdio>#include <cstring>#include <cmath>using namespace std;#define MOD 1000000007int d[2005][2005];int main(){    int n,k;    while(scanf("%d%d",&n,&k)!=EOF){        memset(d,0,sizeof(d));        int i,j,z;        for(i=1;i<=n;i++)            d[1][i]=1;        for(i=1;i<=k;i++){            for(j=1;j<=n;j++){                for(z=j;z<=n;z+=j)                    d[i+1][z]=(d[i+1][z]+d[i][j])%MOD;            }        }        int ans=0;        for(i=1;i<=n;i++)            ans=(ans+d[k][i])%MOD;        printf("%d\n",ans);    }    return 0;}

以上代码已AC,不过仍可小小优化,夜深了还是去睡觉吧。

0 0
原创粉丝点击