“上台阶”的走法

题目描述
有一楼梯共m级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第m级,共有多少走法?
注:规定从一级到一级有0种走法。
输入
输入数据首先包含一个整数n(1<=n<=100),表示测试实例的个数,然后是n行数据,每行包含一个整数m,(1<=m<=40), 表示楼梯的级数。
输出
对于每个测试实例,请输出不同走法的数量。

解题思路:

首先理解这个题的考点。举例说明,

     当m为2时,刚开始在第一级,所以只需要走一步就到了第二级,只有1种走法

     当m为3时,刚开始在第一级,可以走一级、再走一级,是第一种走法,还可以直接走两级到达,是第二种走法。所以此时有2种走法

     当m为4时,刚开始在第一级,可以1,1,1,也可以1,2,还可以2,1,有3种走法。除了这三种,也找不出别的来了。

     当然,到这里为止还看不出什么规律,或者说当m为几时就有几种走法(这是片面的)。别着急,接着举例下来,你就会发现其中的规律

    当m为5时,刚开始在第一级,可以1,1,1,1,或者1,2,1,或者1,1,2,或者2,1,1,还有一种2,2,共5种走法

    当m=6时,可以1,1,1,1,1,或者1,2,2,或者2,2,1或者2,1,2,或者1,1,1,2,或者1,1,2,1,或者1,2,1,1,或者2,1,1,1,共8种

    当m=7时,可以1,1,1,1,1,1,或者1,2,2,1,或者1,2,1,2,或者2,1,2,1……共13种

    当m=8时,共21种

    当m=9时,共34种

找到规律了吗,每个数都等于前两个数的和,和斐波拉契数列有点像哦。为了方便计算,我们把m=0时的走法赋值为0,m=1时的走法赋值为1。

#include<iostream>
using namespace std;
int main () {
  int n,m;
  int d[50];
  d[0] = 0;//当阶梯为0级时,走法0
  d[1] = 1;//当阶梯为1级时,走法1种
  //是一个斐波拉契数列,当i>=2时,数组元素等于前两项的和
  for(int i=2;i<=40;++i){
    d[i] = d[i-1] + d[i-2];
  }
  cin>>n;//测试用例个数
  while(n--) {
    cin>>m;//楼梯级数
    cout<<d[m]<<endl;
  }
  return 0;
}

猜你喜欢

转载自blog.csdn.net/zmeilin/article/details/81262195