爬楼梯习题分析

习题(leetcode 70)

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

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

分析:

此题可以通过使用动态规划来求解,对于动态规划,主要分为五部曲,

  1. 确定dp数组以及下标的含义
  2. 确定递推公式
  3. Dp数组如何初始化
  4. 确定遍历顺序
  5. 举例推导dp数组

大家在做dp习题时,要将这五步先搞清楚

确定确定dp数组以及下标的含义:

        要明确此题的dp[i]代表什么,本题含义为到达i阶有dp[i]种方法

确定递推公式:

        根据题目推导不难发现dp[1]=1,dp[2]=2而dp[3]=3,3正好是dp[1]的值和dp[2]值的和,通过后续推导,会发现dp[4]=dp[3]+dp[2],dp[5]=dp[4]+dp[3],所以得出递推公式。

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

初始化dp数组:

        对于dp数组初始化,大家要注意一定要符合自己定义的dp数组的含义。可能有小伙伴会将dp[0]赋值为1,理由是dp[2]=dp[1]+dp[0],这是不对的,因为dp[0]代表的含义是一开始处于的位置。

确定遍历顺序:从前往后遍历,即从1-n的顺序遍历,但要注意并不是所有的题都是从前往后。

举例推导:

        通过进行调试,验证递推公式是否正确。

代码分析:

class Solution {
public:
    int climbStairs(int n) {
        if (n <= 1) return n; // 因为下面直接对dp[2]操作了,防止空指针
        vector dp(n + 1);
        dp[1] = 1;
        dp[2] = 2;
        for (int i = 3; i <= n; i++) { // 注意i是从3开始的
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp[n];
    }
};

总结:

动态规划问题一直是热点问题,大家在初期要通过动态规划五部曲将解题思路滤清,记住后并熟练应用。还是一样 I will keep fighting!!!

你可能感兴趣的:(动态规划)