Description

一天Sec在化学实验室研究一些化学试剂,他想尝试用元素T和N(当然不是现实中的元素)以不同的顺序和不同的剂量配制出多种试剂。如果Sec有一个放试剂的顺序是“TNT”,则会不小心配制出炸药,就会爆炸。为了防止这个意外发生,Sec想知道用这两种元素取n个出来能配置出多少种试剂出来。

例如n = 3, 则有“TTT, TTN, TNT, TNN, NTT, NTN, NNT, NNN” 8种,其中有一种构造出了TNT序列,所以去除这一种,答案是可配制出7种试剂。

Input
输入包含多个测试样例,以判断输入文件尾(EOF)终止程序。
每个测试样例包含一个整数n( 0 < n <= 63 )

Output

每个输出样例占一行,输出该测试样例对应的答案。

Sample Input

5


Sample Output


7


21

思路一 :递归求解

#include <iostream>
#include <cstdio>
#include <string>
using namespace std;

int len;
int counter;
void fac(string ch ,int n)
{
if(n==len)
{
if(ch.find("TNT")==ch.npos)
{
counter++;
//cout<<ch<<endl;
}
return;
}
fac(ch+'T',n+1);
fac(ch+'N',n+1);
}
int main()
{
string ch;
while(cin>>len)
{
ch="\0";
counter=0;
fac(ch,0);
printf("%d\n",counter);
}
return 0;
}


2   3    4     5     6     7     8

4   7   12  21   37  65   114

优化:由上面的我们可以的到一个 规律: f[n]=f[n-1]+f[n-2]+f[n-4];

#include <iostream>
using namespace std;

// 0,1,2,3, 4,5, 6 ,7, 8
long long f[67]={0,2,4,7,12,21,37,65,114};
int main()
{
for(int i=7;i<65;i++)
{
f[i]=f[i-1]+f[i-2]+f[i-4];
}
int n;
while(cin>>n)
{
cout<<f[n]<<endl;
}
return 0;
}