CCF 100002. 取数游戏

来源:互联网 发布:天津网络微信投票公司 编辑:程序博客网 时间:2024/06/06 17:33

取数游戏

题目描述 


  我们来玩一个游戏:自然数1到N,按顺序列成一排,你可以从中取走任意个数,但是相邻的两个不可以同时被取走。如果你能算出一共有多少种取法,那么你会被天神Lijiganjun奖励。


输入


  仅包含一个数n(1< n < 50)。


输出


  仅包含一个数———你的答案。


样例输入


5


样例输出


13




问题分析:
  1. 这道题的核心思想是斐波那契数列。 先考虑 f[i] 与 f[i-1] 的关系,相当于在 i-1 的序列里最后增加了一个 i ,那么就有以下两种情况,一种是先拿 i , 所以 i - 1 就不能一起拿了,因为相邻的不能一起拿,也就是说这种情况相当于前 i - 2 项跟 i 一起拿,也就是 f[i-2] ;第二种情况是留着 i 最后再拿,也就成了先只拿前 i - 1项 ,即 f[i-1] , f[i] 为两种情况之和,也就是 f[i] = f[i-1] + f[i-2]。以上是思路,下面是我看不懂的地方,首先我们假设n为2时,那输出结果不应该为2吗?也就是说是(1,2)和(2,1)这种情况,但是我看了其他人的博客都是n = 2时结果为3,这个就让我很懵了,这样我的结果跟别人的总是错了一位,也就是说他们算的n = 5的结果跟我算的n = 6的结果一样,哪位大佬能给我解释一下?
以下是AC代码(注意是AC代码,不是我的代码):
#include <iostream>using namespace std;typedef unsigned long long ULL; ULL str[100];ULL fib()  //该函数用来打表{      str[1] = 2;    str[2] = 3;    for(int i=3; i<=70; i++){          str[i] = str[i-1] + str[i-2];  //斐波那契数列打表公式    }  }  int main()  {      fib();                             //调用fib()函数    int n;      while(cin>>n)    {    cout<<str[n]<<endl;}    return 0;  } 




原创粉丝点击