睡前小dp-codeforce414B-dp+一点点想法

http://codeforces.com/problemset/problem/414/B

 

定义一个串为好的串当这个串符合 di|di+1,1<i<k-1

给定一个n为串中元素的取值范围,一个k为串的长度,计算串的所有可能的计数。

 

我一开始想到了用dp[i][j] i表示串的长度,j表示长度为i结尾为j的串的数目。

但是怎么递推我想歪了。我想的是从i-1推出所有的i,这样每次递推都有n^2的复杂度。

看了题解才明白是每次用i把i+1推出来。

 

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int MOD = 1000000007;
int n,k,dp[2010][2010];

int main()
{
    while(~scanf("%d%d",&n,&k))
    {
        memset(dp,0,sizeof dp);
        for(int i=1;i<=n;i++) dp[1][i] = 1;

        for(int i=1;i<k;i++)
        {
            for(int j=1;j<=n;j++)
            {
                for(int p=j;p<=n;p+=j)
                {
                    dp[i+1][p] += (dp[i][j]%MOD);
                    dp[i+1][p] %= MOD;
                }
            }
        }

        int ans = 0;
        for(int i=1;i<=n;i++)
        {
            ans += dp[k][i];
            ans %= MOD;
        }
        printf("%d\n",ans);
    }
}

 

posted @ 2015-12-06 01:46  Helica  阅读(222)  评论(0编辑  收藏  举报