1.题目
You are climbing a staircase. It takes n
steps to reach the top.
Each time you can either climb 1
or 2
steps. In how many distinct ways can you climb to the top?
Example 1:
Input: n = 2 Output: 2 Explanation: There are two ways to climb to the top. 1. 1 step + 1 step 2. 2 steps
Example 2:
Input: n = 3 Output: 3 Explanation: There are three ways to climb to the top. 1. 1 step + 1 step + 1 step 2. 1 step + 2 steps 3. 2 steps + 1 step
2.思路
采用动态规划的方法来做,因为我们后面爬的梯子取决于前面爬的梯子的,比如在
i 处,可以从i-1处爬一格到达 或者通过从i-2处爬两格梯子到达
3.代码
#include <iostream>
#include<vector>
using namespace std;
class Solution {
public:
int climbStairs(int n) {
if (n <= 1) {
return 1;
}
vector<int> dp(n + 1, 0);
dp[0] = 1;
dp[1] = 1;
for (int i = 2; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
};
int main() {
Solution solution;
int n = 8;
solution.climbStairs(n);
std::cout << solution.climbStairs(n) << endl;
return 0;
}
4.总结
当设计动态规划问题时,通常将其分解为子问题来求解,然后利用已解决的子问题来构建原始问题的解
这里爬楼梯就是一个典型的动态规划问题 ,因为每次爬楼梯的方法数只取决于前面两个阶梯的方法数
1.定义一个数组 dp , 其中dp[i] 代表爬到i个阶梯的方法数
2.初始化 dp[0] = 1; dp[1] = 1 因为爬到0梯和第一个梯只有一种办法
3.对于第i个梯子 ,可以采取从i-1处爬一格到达 或者从i-2处爬两格到达 dp[i] = dp[i - 1] + dp[i - 2]
4.最终返回dp[n] 爬第n个梯子的方法数
这个动态规划的思路保证了每一步都只需要依赖前面两步的结果,而不需要保存所有的步骤的结果,从而降低了空间的复杂度