【力扣-动态规划入门】【第 2 天】746. 使用最小花费爬楼梯

标题:746. 使用最小花费爬楼梯
难度:简单
天数:第二天,第2/2题

给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。

你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。

请你计算并返回达到楼梯顶部的最低花费。

示例 1:

输入:cost = [10,15,20]
输出:15
解释:你将从下标为 1 的台阶开始。

  • 支付 15 ,向上爬两个台阶,到达楼梯顶部。
    总花费为 15 。

示例 2:

输入:cost = [1,100,1,1,1,100,1,1,100,1]
输出:6
解释:你将从下标为 0 的台阶开始。

  • 支付 1 ,向上爬两个台阶,到达下标为 2 的台阶。
  • 支付 1 ,向上爬两个台阶,到达下标为 4 的台阶。
  • 支付 1 ,向上爬两个台阶,到达下标为 6 的台阶。
  • 支付 1 ,向上爬一个台阶,到达下标为 7 的台阶。
  • 支付 1 ,向上爬两个台阶,到达下标为 9 的台阶。
  • 支付 1 ,向上爬一个台阶,到达楼梯顶部。
    总花费为 6 。

提示:

  • 2 <= cost.length <= 1000
  • 0 <= cost[i] <= 999

来源:力扣(LeetCode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解:

  1. 走到n步最小花费
  2. 每次只能移动一步,或者两步

dp[n] 表示走到n,所需要的最小花费

那么 只能从dp[n-1]dp[n-2] 走到 dp[n]

那么从n-1n-2中选到一个最小的 + 上当前值cost[n]

就是走到n需要的最小花费

可以推导出动归公式 :

dp[n] = Math.min(dp[n-1], dp[n-2]) + cost[n]

由于公式里有n-1,n-2
那么我们需要初始化dp[0],dp[1]

dp[0] = cost[0];
dp[1] = cost[1];

最终返回的值,应该从dp[n] 和 dp[n-1]中选取一个最小的
借助Math函数取出最小值

return Math.min(dp[n],dp[n-1]);

然后从2....n正序遍历赋值即可

最后完整代码


class Solution {
    //动态规划问题 第二天第2题
    public int minCostClimbingStairs(int[] cost) {
        int size = cost.length;
        //创建一个数组,用于储存累计计算的值
        int [] dp = new int[size];
        //前两个赋值
        dp[0] = cost[0];
        dp[1] = cost[1];

        for(int i = 2; i<size; i++){
            //第i个位置的值,等于i-2、i-2位置最小数 加上   cost当前位置值
            dp[i] = Math.min(dp[i-2]  ,dp[i-1])+ cost[i];
        }
        //返回倒数第一个、第二个数的最小数
        return Math.min(dp[size-1],dp[size-2]);
    }
}

你可能感兴趣的:(力扣-算法(简单)合集,力扣【动态规划】专题,动态规划,leetcode,算法,746.,使用最小花费爬楼梯,java)