标签:
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