70.爬楼梯

题目

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

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

注意:给定 n 是一个正整数。

示例 1:

输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1.  1 阶 + 1 阶
2.  2 阶
示例 2:

输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1.  1 阶 + 1 阶 + 1 阶
2.  1 阶 + 2 阶
3.  2 阶 + 1 阶

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/climbing-stairs
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

这道题输入的是需要n阶你才能到达楼顶,输入的n是不确定的。
爬楼是一层一层爬,这里肯定是有递进关系的,先举例看看能不能有什么规律。

n=1时,有1种方法。
n=2时,有2种方法,可以一步爬两层,或者先爬一层再爬一层。
n=3时,有3种方法,先到还差1阶的位置+爬2层,或者先到还差2阶的位置+爬1层。差3阶的方法数 = 差1阶的方法数+差2阶的方法数

这样看看来是由规律的,后面的状态由前面的状态推出。

可以分成多个子问题,爬第n阶楼梯的方法数量,等于 2 部分之和
爬上 n-1 阶楼梯的方法数量。因为再爬1阶就能到第n阶
爬上 n-2 阶楼梯的方法数量,因为再爬2阶就能到第n阶

套上动态规划做题的步骤
1.确定dp数组以及下标的含义
i表示需要i阶到达楼顶
dp[i]表示爬到楼顶的方法数

2.确定递推公式
dp[i] = dp[i-1] + dp[i-2]

3.dp数组如何初始化
i=0时,表示此时已经在楼顶了,不需要再爬了,那么dp[1] = 0;(这个是没有意义的,只是为了下标对应)
i=1时,dp[1]=1;
i=2时,dp[2]=2;

4.确定遍历顺序
遍历顺序是从左到右

5.举例推导dp数组
当n=5时 1 2 3 5 8

代码

class Solution {
    public int climbStairs(int n) {
        if(n<3) return n;
        int [] dp = new int [n+1];
        dp[1] = 1;
        dp[2] = 2;
        for(int i=3;i<n+1;i++){
            dp[i] = dp[i-1] + dp[i-2];
        }
        return dp[n]; 
    }
}