1、题目描述
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
2、示例
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶
3、题解
基本思想:动态规划法,利用已求的信息计算未求的信息,动态方程dp[i]=dp[i-1]+dp[i-2],因为可以跳1阶或者2阶,所以当前阶跳数等于上阶跳数与上上阶跳数之和。另外试了一下递归回溯法,因为好几次题用递归都超时,所以现在慎用了,结果还真超时了。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
class Solution {
public:
int climbStairs(int n) {
//基本思想:动态规划法,利用已求的信息计算未求的信息
//动态方程dp[i]=dp[i-1]+dp[i-2],因为可以跳1阶或者2阶,所以当前阶跳数等于上阶跳数与上上阶跳数之和
if (n == 1)
return 1;
if (n == 2)
return 2;
vector<int> dp(n, 0);
dp[0] = 1;
dp[1] = 2;
for (int i = 2; i < n; i++)
{
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n-1];
}
};
class Solution1 {
public:
int res = 0;
int climbStairs(int n) {
//基本思想:递归回溯法,因为好几次题用递归都超时,所以现在慎用了,结果还真超时了
Recursion(0, n);
return res;
}
void Recursion(int i, int n)
{
if (i == n - 1)
{
++res;
return;
}
else if (i < n - 1)
{
Recursion(i + 1, n);
Recursion(i + 2, n);
}
return;
}
};
int main()
{
Solution solute;
int n = 9;
cout << solute.climbStairs(n) << endl;
return 0;
}