睡前小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); } }