dfs找状态没找明白 , 直接手写的状态转移 , 反正就2^2的情况。
#include <cstdio> #include <cstring> /* const int mod=2008; int f[106]; int main () { f[0]=1; f[1]=2; f[2]=11 ; f[3]=7*f[1]+2*f[2]+2; f[4]=f[3]*2+f[2]*7+f[1]*6+f[0]*2; for (int i=5 ; i<105 ; ++i) { f[i]=(f[i-1]*2+f[i-2]*7+f[i-3]*6+f[i-4]*2+f[i-5]*2)%mod; } int n; while (scanf("%d",&n),n) { printf("%d\n",f[n]); } return 0; } */ const int mod=2008; int dp[105][4]; /* void dfs(int r , int c , int sta , int pre) { if(c>=2) { if(c==2)dp[r][sta]=(dp[r][sta]+dp[r-1][pre])%mod; return; } dfs(r , c+1 , sta<<1 , pre<<1|1);//no plant dfs(r , c+1 , sta<<1|1 , pre<<1|1);//1 if(c==0)dfs(r , c+1 , 1 , 0);//1+4 if(c==1 && sta==1 && pre==0)dfs(r , c+1 , 3 , 0); dfs(r , c+2 , sta<<2|3 , pre<<2|3);//2. if(c==0)dfs(r , c+1 , sta<<1|1 , pre<<1);//3 if(c==1 && pre==1)dfs(r , c+1 , sta<<1|1 , 2); if(c==1 && sta==0) dfs(r , c+1 , 1 , 0);//4 if(c==0) dfs(r , c+2 , 3 , 1);//5 if(c==0) dfs(r , c+2 , 3 , 2);//6 if(c==0) dfs(r , c+2 , 2 , 0);//7 } */ int main () { int n; while (scanf("%d",&n) , n) { memset (dp , 0 , sizeof(dp)); dp[1][0]=1;dp[1][1]=1;dp[1][2]=1;dp[1][3]=2; //for (int i=2 ; i<=n ; ++i) // dfs(i , 0 , 0 , 0); for (int i=2 ; i<=n ; ++i) { dp[i][0]=(dp[i][0]+dp[i-1][3])%mod;//no dp[i][2]=(dp[i][2]+dp[i-1][3])%mod;//1 dp[i][1]=(dp[i][1]+dp[i-1][3])%mod;//1 dp[i][3]=(dp[i][3]+dp[i-1][3])%mod;//1+1 dp[i][3]=(dp[i][3]+dp[i-1][3])%mod;//2 dp[i][1]=(dp[i][1]+dp[i-1][2])%mod;//3 dp[i][2]=(dp[i][2]+dp[i-1][1])%mod;//3 dp[i][3]=(dp[i][3]+dp[i-1][0])%mod;//3+3 dp[i][3]=(dp[i][3]+dp[i-1][1])%mod;//3+1 dp[i][3]=(dp[i][3]+dp[i-1][2])%mod;//3+1 dp[i][1]=(dp[i][1]+dp[i-1][0])%mod;//4 dp[i][3]=(dp[i][3]+dp[i-1][0])%mod;//4+1 dp[i][2]=(dp[i][2]+dp[i-1][0])%mod;//5 dp[i][3]=(dp[i][3]+dp[i-1][0])%mod;//5+1 dp[i][3]=(dp[i][3]+dp[i-1][1])%mod;//6 dp[i][3]=(dp[i][3]+dp[i-1][2])%mod;//7 } printf("%d\n" , dp[n][3]%mod); } return 0; }