代码和思路全在里面,读者可以自己模拟
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
int main()
{
/*
6个状态
取 2
取 0 2
取 2 3
取 2 3 0
取 2 0 1
取 全部
1 2 3 4 5 6
0 1 1 1 1
1 0 1 3 7
2 0 1 2 3
3 0 0 2 6
4 0 0 1 4
5 0 0 0 3
dp[i][0] = 1;
dp[i][1] = dp[i-1][0] + dp[i-1][1]*2;
dp[i][2] = dp[i-1][0] + dp[i-1][2];
dp[i][3] = dp[i-1][2] + dp[i-1][1] + dp[i-1][3]*2;这次决策中会令上次决策又又两个决策
dp[i][4] = dp[i-1][1] + dp[i-1][4]*2;同上
dp[i][5] = dp[i-1][4] + dp[i-1][3] + dp[i-1][5]*2;同上
*/
int n,i,j;
long long int dp[1000][6];
cin>>n;
memset(dp,0,sizeof(dp));
for(i = 1 ;i <= n; i++)
{
dp[i][0] = 1;
dp[i][1] = (dp[i-1][0] + dp[i-1][1]*2)%1000000007;
dp[i][2] = (dp[i-1][0] + dp[i-1][2])%1000000007;
dp[i][3] = (dp[i-1][2] + dp[i-1][1] + dp[i-1][3]*2)%1000000007;
dp[i][4] = (dp[i-1][1] + dp[i-1][4]*2)%1000000007;
dp[i][5] = (dp[i-1][4] + dp[i-1][3] + dp[i-1][5]*2)%1000000007;
}
cout<<dp[n][5]%1000000007<<endl;
return 0;
}