使用两个数组来递归,f数组表示n个元素的排列种类数,w数组表示f[n]中最后一个元素是O的种类数。
1)对于第n个元素的选择:如果第n-1个元素是O的话,那么第n个元素只有两种选择,如果第n个元素不是O的话就可以有三种选择了。
2)第n个元素是O的个数:如果第n-1个元素是O的话,那么第n个元素就不能是O了,所以第n个元素是O的个数等于前n-1个元素的排列数减去第n-1个元素是O的情况。
#include<iostream>
using namespace std;
int main()
{
long long a[55],b[55];
a[1]=3;
a[2]=8;
b[1]=1;
b[2]=2;
for(int i=3; i<55; i++)
{
a[i]=b[i-1]*2+(a[i-1]-b[i-1])*3;
b[i]=a[i-1]-b[i-1];
}
int n;
while(cin>>n)
printf("%I64d\n",a[n]);
return 0;
}