zoukankan      html  css  js  c++  java
  • 睡前小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
    ",ans);
        }
    }
  • 相关阅读:
    线段树(updata+query)
    铁轨(栈)
    困难的串(搜索)
    素数环(简单搜索)
    编码
    opencv + numpy for python
    PIL参考手册
    八数码问题
    三维地图(BFS)
    梯田(dfs)
  • 原文地址:https://www.cnblogs.com/helica/p/5022745.html
Copyright © 2011-2022 走看看