标签:
分析:首先想到每个钥匙的结尾有4种状态,不过题目还需要判断有三种不同的钥匙深度,所以每种深度结尾后有2^4种状态,0000->1111,不过题目还需需要有相邻的钥匙深度大于等于3,所以需要两种不同的状态表示0表示没有出现过这样的,1表示出现过,然后开一个4维的数组进行状态转移就好了dp[MAXN][bit][1<<bit][2]。
代码如下:
============================================================================================================================
#include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> using namespace std; const int MAXN = 32; const int bit = 4; long long dp[MAXN][bit][1<<bit][2]; int main() { dp[1][0][1][0] = dp[1][1][2][0] = 1; dp[1][2][4][0] = dp[1][3][8][0] = 1; for(int i=1; i<MAXN; i++) for(int j=0; j<bit; j++) for(int k=0; k<(1<<bit); k++) { if(dp[i][j][k][0]) { for(int t=0; t<4; t++) { if(abs(j-t) == 3) dp[i+1][t][k|(1<<t)][1] += dp[i][j][k][0]; else dp[i+1][t][k|(1<<t)][0] += dp[i][j][k][0]; } } if(dp[i][j][k][1]) { for(int t=0; t<4; t++) dp[i+1][t][k|(1<<t)][1] += dp[i][j][k][1]; } } long long sum[MAXN]={0}; for(int i=3; i<MAXN; i++) for(int j=0; j<bit; j++) for(int k=7; k<16; k++) { if(k==7||k==11||k>=13) sum[i] += dp[i][j][k][1]; } for(int i=2; i<MAXN; i++) { printf("N=%d: %lld\n", i, sum[i]); } return 0; }
标签:
原文地址:http://www.cnblogs.com/liuxin13/p/4849651.html