力扣 746. 使用最小花费爬楼梯

题目来源:https://leetcode.cn/problems/min-cost-climbing-stairs/description/

力扣 746. 使用最小花费爬楼梯_第1张图片

力扣 746. 使用最小花费爬楼梯_第2张图片 

 C++题解1:动态规划。虽然我的本意是跳到第i个台阶的花费,但代码写着写着就歪了。。

class Solution {
public:
    int minCostClimbingStairs(vector& cost) {
        int len = cost.size();
        vector dp(len, 0); //第i个台阶往上跳的花费
        dp[0] = cost[0];
        dp[1] = cost[1];
        for(int i = 2; i < len; i++) {
            dp[i] = min(dp[i-1], dp[i-2]) + cost[i];
        }
        return min(dp[len-2], dp[len-1]);
    }
};

C++题解2(来源代码随想录):

  1. 确定dp数组以及下标的含义。dp[i]的定义:到达第i台阶所花费的最少体力为dp[i]
  2. 确定递推公式。可以有两个途径得到dp[i],一个是dp[i-1] 一个是dp[i-2]。dp[i - 1] 跳到 dp[i] 需要花费 dp[i - 1] + cost[i - 1];dp[i - 2] 跳到 dp[i] 需要花费 dp[i - 2] + cost[i - 2]。
  3. dp数组如何初始化。初始化 dp[0] = 0,dp[1] = 0;
  4. 确定遍历顺序。因为是模拟台阶,而且dp[i]由dp[i-1]dp[i-2]推出,所以是从前到后遍历cost数组就可以了。
  5. 举例推导dp数组。
class Solution {
public:
    int minCostClimbingStairs(vector& cost) {
        vector dp(cost.size() + 1);
        dp[0] = 0; // 默认第一步都是不花费体力的
        dp[1] = 0;
        for (int i = 2; i <= cost.size(); i++) {
            dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
        }
        return dp[cost.size()];
    }
};

C++题解3:简化版。因为dp[i]就是由前两位推出来的,那么也不用dp数组了。

class Solution {
public:
    int minCostClimbingStairs(vector& cost) {
        int dp0 = 0;
        int dp1 = 0;
        for (int i = 2; i <= cost.size(); i++) {
            int dpi = min(dp1 + cost[i - 1], dp0 + cost[i - 2]);
            dp0 = dp1; // 记录一下前两位
            dp1 = dpi;
        }
        return dp1;
    }
};

你可能感兴趣的:(开始C++吧,leetcode,算法,c++,贪心算法)