YT03-递推求解课后题目-1002 超级楼梯-(6.7日-烟台大学ACM预备队解题报告)

来源:互联网 发布:vue.js jquery ajax 编辑:程序博客网 时间:2024/04/27 19:17

超级楼梯

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 97   Accepted Submission(s) : 38

Font: Times New Roman | Verdana | Georgia

Font Size:  

Problem Description

有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?

Input

输入数据首先包含一个整数N,表示测试实例的个数,然后是N行数据,每行包含一个整数M(1<=M<=40),表示楼梯的级数。

Output

对于每个测试实例,请输出不同走法的数量

Sample Input

223

Sample Output

12

Author

lcy

Source

2005实验班短学期考试




144-2刘炎


解题思路:


每次有2种走法,并且要求最后还能正好到达M级。正着不行,逆向思维一下:要达到最后一级的前一级有两种可能,M-1或者M-2;

也就是说就是到达M-1的走法加上M-2的走法相加就等于到达最后一级的走法。

所以递推公式:

                      F(1)=1F(2)=1

                      F(n)=F(n-1)+F(n-2);


可以用递归或者递推两种方法实现

递归找的是递归函数,递推找的是递推公式;

递归函数每一次的调用都要保留现场,占用空间,多组测试容易超时,递推只需要公式打表即可;

long longjisuan(intn)

{

    if(n==1)return 1;

    if(n==2)return 2;

    else return jisuan(n-1)+jisuan(n-2);

}


#include <iostream>  using namespace std;   int main()  {      int a[41],N,M;       cin>>N;        a[1]=1; a[2]=1;      for(int i=3;i<=40;i++)          a[i]=a[i-1]+a[i-2];      while(N--)    {          cin>>M;          cout<<a[M]<<endl;      }      return 0;  }


0 0
原创粉丝点击