典型的思维题,每个以E或者F结尾的字符串下一个字符都有E、O、F三种情况,而以O结尾的字符串下一个字符却只有E、F两种情况,借此就能找出数学规律,将字符长度为1的情况初始化,然后下一个字符的涂法根据上一个字符的情况去增加,类似于动态规划的思想。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
long long a[45],b[45];
a[1]=3;
b[1]=1;//初始化字符长度为1的情况
for(int i=2;i<=40;i++)//确定字符串长度为i时的涂法种数
{
a[i]=(a[i-1]-b[i-1])*3+(b[i-1])*2;
b[i]=(a[i-1]-b[i-1]);//记录字符串长度为i时最后一个字符为O的涂法种数
}
int n;
while(~scanf("%d",&n))
{
printf("%lld\n",a[n]);
}
return 0;
}