找规律,试剂TNT

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;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值