题目链接
0表示白
1表示红
2表示蓝
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll dp[50][40],n;
ll dfs(int pos,int state){
if(pos==0) return 1;
if(dp[pos][state]!=-1) return dp[pos][state];
ll i,ans = 0;
for(i = 0;i < 3;i ++){
int p1 = state%10;
int p2 = state/10;
if(i==p1)continue;
if(i==0||i==1){
if(p1==2&&p2==i) continue;
ans += dfs(pos-1,p1*10+i);
}
if(i==2) {
if(pos==1) continue;
ans += dfs(pos-1,p1*10+i);
}
}
dp[pos][state] = ans;
return ans;
}
int main()
{
// freopen("a.txt","r",stdin);
int i;
cin>>n;
memset(dp,-1,sizeof(dp));
cout<<dfs(n-1,1)+dfs(n-1,0);
return 0;
}