题目来源(力扣):

https://leetcode.cn/problems/climbing-stairs/description/

题目描述:

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

基本思路:

假设一次只能走1个台阶,到达第n个台阶的方案实际上就是到达第n-1个台阶的方案,即dp[i]=dp[i-1]。

在到达第n-1个台阶之后,再多走一次(1步)就到底第n个台阶。

同理,一次只能走1~2个台阶,到达第n个台阶的方案实际上就是到达第n-1与n-2个台阶的方案的和,即dp[i]=dp[i-1]+dp[i-2]。

在到达第n-1个台阶之后,再多走一次(1步)就到达第n个台阶;在到达第n-2个台阶之后,再多走一次(2步)就到达第n个台阶。

以n=4为例,

dp[1]=1;

dp[2]=2;

dp[3]=dp[1]+dp[2]=3;

dp[4]=dp[2]+dp[3]=2+3=5;

补充,此时整个dp数组就是斐波那契数列 https://www.cnblogs.com/hb-computer/articles/18562880

代码实现:

class Solution

{

public:

int climbStairs(int n)

{

//0. 先处理特殊情况

if (n == 1)

return 1;

if (n == 2)

return 2;

// 1. 确定dp数组以及含义 dp[i]表示台阶为i时需要花费的步数

vector dp(n + 1);

// 2. 确定递推方程

// dp[n]=dp[n-1]+dp[n-2]

// 3. dp数组初始化

// 最开始在第0台阶,到达第1台阶的方式只有1种(0->1),到达第2台阶的方式有2种(0->1->2;0->2)

dp[0] = 0, dp[1] = 1, dp[2] = 2;

// 4. 确定遍历顺序 :从前往后

for (int i = 3; i <= n; i++)

{

dp[i] = dp[i - 1] + dp[i - 2];

}

// 5. 打印(部分)dp数组以验证是否正确

// for(int i=1;i

// cout<

return dp[n];

}

};

时间复杂度

O(n)