【思路】
dp[i][j]表示前i个数为第j种状态,考虑6种状态
0: 出现且仅出现 2
1: 出现且仅出现 2 0
2: 出现且仅出现 2 3
3: 出现且仅出现 2 0 1
4: 出现且仅出现 2 0 3
5: 出现且仅出现 2 0 1 3
【AC】
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<cmath> 6 #include<algorithm> 7 #include<queue> 8 #include<map> 9 using namespace std; 10 const int mod=1e9+7; 11 const int maxn=1e3+2; 12 int dp[maxn][6]; 13 void pre(){ 14 memset(dp,0,sizeof(dp)); 15 dp[1][0]=1; 16 for(int i=2;i<maxn;i++){ 17 dp[i][0]=1; 18 dp[i][1]=((dp[i-1][1]*2)%mod+dp[i-1][0])%mod; 19 dp[i][2]=(dp[i-1][2]+dp[i-1][0])%mod; 20 dp[i][3]=(dp[i-1][1]+(dp[i-1][3]*2)%mod)%mod; 21 dp[i][4]=((dp[i-1][1]+dp[i-1][2])%mod+(dp[i-1][4]*2)%mod)%mod; 22 dp[i][5]=((dp[i-1][3]+dp[i-1][4])%mod+dp[i-1][5]*2%mod)%mod; 23 } 24 } 25 int n; 26 int main(){ 27 pre(); 28 while(~scanf("%d",&n)){ 29 printf("%d ",dp[n][5]); 30 } 31 return 0; 32 }