首页 > 其他分享 >03_使用最小花费爬楼梯

03_使用最小花费爬楼梯

时间:2024-05-24 16:51:07浏览次数:14  
标签:03 遍历 爬楼梯 花费 cost 数组 下标 dp

746. 使用最小花费爬楼梯

旧题目描述

数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始)。

每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应的体力值,你就可以选择向上爬一个阶梯或者爬两个阶梯。

请你找出达到楼层顶部的最低花费。在开始时,你可以选择从下标为 0 或 1 的元素作为初始阶梯。

示例 1:

  • 输入:cost = [10, 15, 20]
  • 输出:15
  • 解释:最低花费是从 cost[1] 开始,然后走两步即可到阶梯顶,一共花费 15 。

示例 2:

  • 输入:cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]
  • 输出:6
  • 解释:最低花费方式是从 cost[0] 开始,逐个经过那些 1 ,跳过 cost[3] ,一共花费 6 。

提示:

  • cost 的长度范围是 [2, 1000]。
  • cost[i] 将会是一个整型数据,范围为 [0, 999] 。

【思路】

修改之后的题意就比较明确了,题目中说 “你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯” 也就是相当于跳到下标0或者下标1是不花费体力的,从下标0下标1开始跳就要花费体力了。

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

使用动态规划,就要有一个数组来记录状态,本题只需要一个一维数组dp[i]就可以了。

dp[i]的定义:到达第i台阶所花费的最少体力为dp[i]

对于dp数组的定义,大家一定要清晰!

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]。

那么究竟是选从dp[i - 1]跳还是从dp[i - 2]跳呢?

一定是选最小的,所以dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);

3、dp数组如何初始化

看一下递归公式,dp[i]由dp[i - 1],dp[i - 2]推出,既然初始化所有的dp[i]是不可能的,那么只初始化dp[0]和dp[1]就够了,其他的最终都是dp[0]dp[1]推出。

那么 dp[0] 应该是多少呢? 根据dp数组的定义,到达第0台阶所花费的最小体力为dp[0],那么有同学可能想,那dp[0] 应该是 cost[0],例如 cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1] 的话,dp[0] 就是 cost[0] 应该是1。

这里就要说明本题力扣为什么改题意,而且修改题意之后 就清晰很多的原因了。

新题目描述中明确说了 “你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。” 也就是说 到达 第 0 个台阶是不花费的,但从 第0 个台阶 往上跳的话,需要花费 cost[0]。

所以初始化 dp[0] = 0,dp[1] = 0;

4、确定遍历顺序

最后一步,递归公式有了,初始化有了,如何遍历呢?

本题的遍历顺序其实比较简单,简单到很多同学都忽略了思考这一步直接就把代码写出来了。

因为是模拟台阶,而且dp[i]由dp[i-1]dp[i-2]推出,所以是从前到后遍历cost数组就可以了。

但是稍稍有点难度的动态规划,其遍历顺序并不容易确定下来。 例如:01背包,都知道两个for循环,一个for遍历物品嵌套一个for遍历背包容量,那么为什么不是一个for遍历背包容量嵌套一个for遍历物品呢? 以及在使用一维dp数组的时候遍历背包容量为什么要倒序呢?

5、举例推导dp数组

实现代码如下:

import java.util.*;
class Solution {
	public int minCostClimbingStairs(int[] cost) {
		//初始化dp数组,表示的是第i层阶梯所要消耗的最小体力值
        int[] dp = new int[cost.length + 1];
        dp[0] = 0;//从下标为 0 或下标为 1 的台阶开始,因此支付费用为0
        dp[1] = 0;
        for(int i = 2; i <= cost.length; i++) {
            //从dp[i-1]跳一步,跳的时候才会消耗体力值;
            //从dp[i-2]跳两步,跳的时候才会消耗体力值;
            //最终取出最小的体力值作为
            dp[i] = Math.min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2]);
        }
        return dp[cost.length];
	}
}

标签:03,遍历,爬楼梯,花费,cost,数组,下标,dp
From: https://www.cnblogs.com/codingbao/p/18211269

相关文章

  • zabbix - [03] 安装部署
    题记部分 一、准备工作1.1、服务器角色规划主机名IP地址角色备注ctos79-01192.168.2.121zabbix-server开启监控功能ctos79-02192.168.2.122zabbix-agent ctos79-03192.168.2.133zabbix-agent 1.2、关闭防火墙和SELinuxsetenforce0sed-i......
  • yarn dev 或者 npm run dev 或node -v 等报错:'node' 不是内部或外部命令,也不是可运行
    1,重新配置环境变量:控制面板——系统和安全——系统——高级系统设置——环境变量——系统变量——找到path,双击修改或新增node安装路径,一般是:“C:\ProgramFiles\nodejs”,一路“确定”保存设置2,检查path路径是否正确电脑任务栏搜索cmd,打开cmd编辑器检查nodejs路径:3......
  • 梦断代码阅读笔记03
    梦断代码阅读笔记03团队合作与冲突在过去的团队合作中,作为一个软件工程学生,我常常专注于自己的代码和单独完成任务,忽视了团队合作的重要性。如果团队中出现了冲突或分歧,我倾向于回避或让步,以求快速解决问题,但这种做法并未真正解决根本问题,反而留下隐患。结合《梦断代码》一书中......
  • G2303高一上照片
    ![image](https://img20![image](https://img20![image](https://img20......
  • 03-Excel基础操作-学习笔记
    本节接着继续介绍排序工具以及一个重要内容分类汇总工具的使用。01自定义排序我们在上一节接触到了使用排序工具,对数字之类的Excel内置的程序可以通过点击操作,但是当超出Excel内置的范围又当如何应对?比如,存在如下场景:针对文字的排序,我们对销售部门所在列进行排序,顺序为“一部......
  • luffy路飞项目上线03
    云服务器购买(领了3个月免费的)1#1咱们项目要上线2-1有台服务器:安装软件:mysql;运行django。。。3-2公网ip:互联网用户都可以访问4-3域名:备案,互联网用户都可以访问,输入地址,而不是ip567#2购买云服务器8-这台服务器--》不在......
  • 【DRF-03】rest-framework之APIView
    安装djangorestframeworkpipinstalldjangorestframework基本流程:url--》视图类--》执行dispatch方法fromrest_framework.viewsimportAPIViewfromrest_framework.responseimportResponseclassTestView(APIView):defdispatch(self,request,*args,*......
  • 2022-07-03-含有非期望产出的sbm模型python代码
    传统的径向DEA模型无法考虑“松弛变量”对效率值的影响,也没有考虑同时使期望产出增加,非期望产出减少的技术变化,以此度量的效率值是不准确或有偏的,为了解决这一问题,Tone(2001)提出了基于投入产出松弛变量的环境效率评价模型,简称SBM模型,在此基础上,他进一步提出了SBM的拓展模型,从而实......
  • CSP历年复赛题-P1044 [NOIP2003 普及组] 栈
    原题链接:https://www.luogu.com.cn/problem/P1044题意解读:一组数入栈、出栈的方案数,如果了解卡特兰数,此题可以秒杀;如果不了解,也可以通过递归或者递推来解决;最次,可以通过DFS暴搜出方案数,当然对于n个数,一共有n次入栈、n次出栈,一共2n次,每次要么入栈要么出栈,总搜索次数在22n规模,n最......
  • CSP历年复赛题-P1045 [NOIP2003 普及组] 麦森数
    原题链接:https://www.luogu.com.cn/problem/P1045题意解读:要计算2p-1的位数和最后500位,实际上只需要计算2p,两者位数一致,前者比后者个位减1即可,且个位肯定不会是0,比较容易处理。解题思路:如果直接采用高精度乘法计算2p,p最大3.1*106,高精度所用数组最长大概9*105,一共最多计算3.......