C++爬楼梯


假设有n阶楼梯。一个人要从第1阶走到第n阶。一次最多能跨越的台阶数也是给定的。根据这些信息,我们需要找到到达第n阶楼梯的所有可能方法。假设一个人每次最多能跨越两阶楼梯。那么我们可以找到递归关系来解决这个问题。一个人可以从(n-1)阶或(n-2)阶走到第n阶。所以ways(n) = ways(n-1) + ways(n-2)。

例如,楼梯数为10,一次最多能跨越的台阶数为2,则输出将是89种可能的方法。

要解决这个问题,请遵循以下步骤:

  • 定义一个与楼梯数大小相同的数组count
  • count[0] := 1
  • 对于 i := 2 到 stair -1,执行:
    • count[i] := 0
    • 对于 j = 1 到 i 且 j <= max,执行:
      • count[i] := count[i] + count[i - j]
  • 返回 count[stair - 1]

让我们来看一下实现,以便更好地理解

示例 (C++)

 在线演示

#include<iostream>
using namespace std;
int stairClimbWays(int stair, int max){
   int count[stair]; //fill the result stair using bottom up manner
   count[0] = 1; //when there are 0 or 1 stair, 1 way to climb
   count[1] = 1;
   for (int i=2; i<stair; i++){ //for stair 2 to higher
      count[i] = 0;
      for(int j=1; j<=max && j<=i; j++)
         count[i] += count[i-j];
   }
   return count[stair-1];
}
int countWays(int stair, int max){ //person can climb 1,2,...max stairs at a time
   return stairClimbWays(stair+1, max);
}
int main (){
   int stair, max;
   cout << "Enter number of stairs: "; cin >> stair;
   cout << "Enter max stair a person can climb: "; cin >> max;
   cout << "Number of ways to reach: " << countWays(stair, max);
}

输入

Stairs = 10
Max stairs a person can climb: 2

输出

Enter number of stairs: 10
Enter max stair a person can climb: 2
Number of ways to reach: 89

更新于: 2020年4月28日

562 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告