文章目录
leetcode70:70. 爬楼梯
题目描述
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
**注意:**给定 n 是一个正整数。
Example
输入: 5
输出: 8
solution idea
动态规划
不难发现,这个问题可以被分解为一些包含最优子结构的子问题,即它的最优解可以从其子问题的最优解来有效地构建,我们可以使用动态规划来解决这一问题。
第 i
阶可以由以下两种方法得到:
在第 (i-1)
阶后向上爬一阶。
在第(i-2)
阶后向上爬 2 阶。
所以到达第 i
阶的方法总数就是到第 (i-1)
阶和第 (i-2)
阶的方法数之和。
令 dp[i]
表示能到达第i
阶的方法总数:$ dp[i]=dp[i-1]+dp[i-2] $
class Solution {
/*
** 动态规划
*/
public:
int climbStairs(int n) {
if(n==1) return 1;
if(n==2) return 2;
int dp[n];
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];
}
斐波那契数列
F i b ( n ) = F i b ( n − 1 ) + F i b ( n − 2 ) Fib(n)=Fib(n−1)+Fib(n−2) Fib(n)=Fib(n−1)+Fib(n−2)
class Solution {
/*
** 斐波那契数列
*/
public:
int climbStairs(int n) {
if(n==1) return 1;
int first=1,second=2;
for(int i=2;i<n;i++)
{
int third=first+second;
first=second;
second=third;
}
return second;
}
};
参考文献
- c++ prime 第5版