标签:
Description
Input
Output
Sample Input
input | output |
---|---|
4 |
204 |
大意:给你一个n表示几位数,让你输出满足三素数的数有多少个,三素数的定义为每三个连续的数都是一个素数
自己想到了大致要定义一个prime[j][k][l]来判断,还是想不出状态转移方程
状态转移方程 下一个状态可以由dp[i-1][k][l] 得到,所要添加的只是最高位,只要满足最高位以及接下来的两个数的集合也满足的话就行
也就是 dp[i][j][k] = dp[i][j][k] + dp[i-1][k][l],前一个状态的dp值是i-1位的时候所有满足条件的情况所以只要判prime[j][k][l]是素数就行
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; long long dp[10100][10][10]; int prime[10][10][10]; const int mod = 1e9 + 9; void solve() { int j; memset(prime,0,sizeof(prime)); for(int i = 100; i <= 999;i++){ for( j = 2; j < i;j++){ if(i%j == 0) break; } if(j >= i){ int x1 = i/100; int x2 = (i%100)/10; int x3 = i%10; prime[x1][x2][x3] = 1; } } for(int i = 1; i <= 9; i++){ for(int j = 0 ; j <= 9;j++){ for(int k = 0 ; k <= 9; k++){ if(prime[i][j][k]) dp[3][i][j]++; } } } for(int i = 4; i <= 10000;i++){ for(int j = 1; j <= 9; j++){ for(int k = 0 ; k <= 9; k++){ for(int l = 0 ; l <= 9;l++){ if(prime[j][k][l]) dp[i][j][k] = (dp[i-1][k][l] + dp[i][j][k]) % mod; } } } } } int main() { solve(); int n; while(~scanf("%d",&n)){ long long res = 0; for(int i = 1; i <= 9;i++){ for(int j = 0 ; j <= 9;j++){ res += 1ll*dp[n][i][j]; res%=mod; } } printf("%lld\n",res); } return 0; }
URAL1586——DP——Threeprime Numbers
标签:
原文地址:http://www.cnblogs.com/zero-begin/p/4490883.html