LeetCode刷题复盘笔记—一文搞懂746. 使用最小花费爬楼梯(动态规划系列第二篇)

news2025/7/18 5:47:54

今日主要总结一下动态规划的一道题目,746. 使用最小花费爬楼梯

题目:746. 使用最小花费爬楼梯

题目描述:
给你一个整数数组 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

本题重难点

大家在做这道题之前最好做一下70. 爬楼梯
这道题,本题是70. 爬楼梯的进阶版
或者看一下一文搞懂动态规划系列(第一篇)509. 斐波那契数70. 爬楼梯我对爬楼梯这道题有详细的讲解

对于动态规划问题,可以拆解为如下五步曲,这五步都搞清楚了,才能说把动态规划真的掌握了!

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

后面的讲解中我都是围绕着这五点来进行讲解。

可能刷过动态规划题目的同学可能都知道递推公式的重要性,感觉确定了递推公式这道题目就解出来了。
其实 确定递推公式 仅仅是解题里的一步而已!
一些同学知道递推公式,但搞不清楚dp数组应该如何初始化,或者正确的遍历顺序,以至于记下来公式,但写的程序怎么改都通过不了。
后序的讲解的大家就会慢慢感受到这五步的重要性了。

  1. 首先确定dp数组以及下标的含义
    使用动态规划,就要有一个数组来记录状态,本题只需要一个一维数组dp[i]就可以了。
    dp[i]的定义(往往就是题目要最终求得的结果):本题即到达第i台阶所花费的最少体力为dp[i]。
    对于dp数组的定义,大家一定要清晰!

  2. 第二步是确定递推公式
    一些同学可能想为什么要先确定递推公式,然后在考虑初始化呢?——因为一些情况是递推公式决定了dp数组要如何初始化!
    确定递推公式
    可以有两个途径得到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数组
    拿示例2:cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1] ,来模拟一下dp数组的状态变化,如下:

在这里插入图片描述

如果大家代码写出来有问题,就把dp数组打印出来,看看和如上推导的是不是一样的。

C++代码

方法一、常规动态规划

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        vector<int> 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()];
    }
};

时间复杂度:O(n)
空间复杂度:O(n)

方法二、动归空间复杂度优化

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        int dp0 = 0;
        int dp1 = 0;
        int res;
        for(int i = 2; i <= cost.size(); i++){
            res = min((dp0 + cost[i - 2]), (dp1 + cost[i - 1]));
            dp0 = dp1;
            dp1 = res;
        }
        return res;
    }
};

时间复杂度:O(n)
空间复杂度:O(1)

这一题比较简单主要是题目描述就已经把动规五部曲里的递归公式和如何初始化都给出来了,剩下几部曲也自然而然的推出来了,但是还是要清楚地理解每一步,因为一般题目都是要寄几分析推导递推公式和如何初始化!


总结

动态规划
英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。
动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,贪心没有状态推导,而是从局部直接选最优的

对于动态规划问题,可以拆解为如下五步曲,这五步都搞清楚了,才能说把动态规划真的掌握了!

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

后面的讲解中我都是围绕着这五点来进行讲解。

可能刷过动态规划题目的同学可能都知道递推公式的重要性,感觉确定了递推公式这道题目就解出来了。
其实 确定递推公式 仅仅是解题里的一步而已!
一些同学知道递推公式,但搞不清楚dp数组应该如何初始化,或者正确的遍历顺序,以至于记下来公式,但写的程序怎么改都通过不了。
后序的讲解的大家就会慢慢感受到这五步的重要性了。


欢迎大家关注本人公众号:编程复盘与思考随笔

(关注后可以免费获得本人在csdn发布的资源源码)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/17506.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux之关于Nginx

目录 1、什么是Nginx&#xff1f; 1.1、负载均衡&#xff1a;流量分摊​编辑 1. 2、反向代理 &#xff1a;处理外网访问内网问题 1.3、动静分离:判断动态请求还是静态请求&#xff0c;选择性的访问指定服务器 2、Nginx的使用 2.1.Nginx安装 2.1.1 添…

11月27日PMI认证才聚各考点防疫要求,PMP考生必看

11月27日深圳才聚、珠海才聚、东莞才聚、南宁才聚防疫要求及如下&#xff1a; 注意&#xff1a;由于疫情防控影响&#xff0c;以下城市的考试将延期举办&#xff0c;该考点的考生无需做任何操作。 北京、天津、石家庄、廊坊、保定、哈尔滨、大庆、呼和浩特、太原、郑州、兰州…

【王道计算机网络笔记】计算机网络体系结构-计算机网络概述

文章目录计算机网络的概念计算机网络的功能计算机网络的组成计算机网络的分类标准化工作及相关组织相关组织计算机网络的性能指标速率带宽吞吐量时延时延带宽积往返时延RTT利用率计算机网络的概念 计算机网络&#xff1a;是一个分散的、具有独立功能的计算机系统&#xff0c;通…

[附源码]java毕业设计汽车租赁系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

绿竹生物获上市“大路条”:融资不搞研发去理财,孔健下什么棋?

11月19日&#xff0c;绿竹生物发布消息称&#xff0c;该公司于2022年11月11日获得中国证监会关于首次公开发行境外上市外资股&#xff08;H股&#xff09;及境内未上市股份全流通&#xff08;即“大路条”&#xff09;的批复&#xff0c;下一步将根据香港联交所的聆讯进度安排及…

【JavaSE】接口

前言&#xff1a; 作者简介&#xff1a;爱吃大白菜1132 人生格言:纸上得来终觉浅&#xff0c;绝知此事要躬行 如果文章知识点有错误的地方不吝赐教&#xff0c;和大家一起学习&#xff0c;一起进步&#xff01; 如果觉得博主文章还不错的话&#xff0c;希望三连支持&#xff01…

web课程设计网页规划与设计----公司官网带轮播图 (页面精美 1页)

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 公司官网网站 | 企业官网 | 酒店官网 | 等网站的设计与制 | HTML期末大学生网页设计作业&#xff0c;Web大学生网页 HTML&#xff1a;结构 CSS&#…

垃圾回收相关概念概述(宋红康JVM学习笔记)

System.gc() 在默认情况下&#xff0c;通过System.gc()或者Runtime.getRuntime().gc()的调用&#xff0c;会显式触发Full GC&#xff0c;同时对老年代和新生代进行回收&#xff0c;尝试释放被丢弃对象占用的内存。 然而System.gc()调用附带一个免责声明&#xff0c;无法保证对…

java 基于springBoot上传文件/文件夹使用实例

最近项目中遇到一个文件批量上传的需求&#xff0c;对单个的文件、多文件或者文件夹的方式上传文件都可以满足要求&#xff0c;总结一下使用经验。 案例基于springBoot. 1、文件上传请求 这里postman测试了单文件和多文件的上传&#xff0c;同时测试了文件件方式上传。 postman…

物联网开发笔记(48)- 使用Micropython开发ESP32开发板之控制OLED ssd1306屏幕

一、目的 这一节我们学习如何使用我们的ESP32开发板来控制OLED ssd1306屏幕&#xff0c;此处使用的是I2C协议&#xff0c;大家可自行百度学习一下I2C。 二、环境 ESP32 OLED ssd1306屏幕 Thonny IDE&#xff08;或者WOKWI在线仿真&#xff09; 几根杜邦线 本次使用在线仿真…

vue 项目在加载完成之前,显示预置加载动画

vue 项目在加载完成之前&#xff0c;显示预置加载动画 自己有一个日记项目&#xff0c;由于服务器带宽很小1MB&#xff0c;在加载之前页面中显示是空白的&#xff0c;就想给它加个前置的动画&#xff0c;这个用户体验更好。 一、实现 1. 定义项目入口 如果你是 pwa 应用&am…

[附源码]计算机毕业设计JAVA化妆品销售管理系统

[附源码]计算机毕业设计JAVA化妆品销售管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM myba…

SQL语句的约束 总结

目录 基本概念 主键约束 概念 操作 自增长约束 概念 操作 非空约束 概念 操作 唯一约束 概念 操作 默认约束 概念 操作 零填充约束 概念 约束总结 基本概念 主键约束 概念 主键约束相当于 唯一约束 非空约束 的组合&#xff0c;主键约束列不允许重复&am…

http网站升级为https网站,证书、http-flv视频显示处理

一、使用OpenSSL生成自签名证书 升级https网站需要自签名证书&#xff0c;证书在视频服务器Nginx中也需要&#xff0c;使用OpenSSL生成。 1.下载安装OpenSSL 2.以管理员身份运行cmd进入OpenSSL的安装目录查看安装版本 3.生成自签名证书。 生成私钥&#xff1a;openssl genr…

【 STM32Fxx串口问题-发送时间-发送字节拉长-每一位与下一位也拉长->>记录问题以及解决方式-复盘】

【 STM32Fxx串口问题-发送时间-发送字节拉长-每一位与下一位也拉长-&#xff1e;&#xff1e;记录问题以及解决方式】前言环境问题描述&#xff08;1&#xff09;测试uart5时&#xff1a;&#xff08;2&#xff09;测试uart1时&#xff1a;原因点解决方式细节点总结前言 在做项…

1388. 3n 块披萨

文章目录1. 背2. 题目3. 答案1. 背 首先&#xff0c;考虑没有环的情况。如果没有环这道题可以转变为和打家劫舍II一毛一样。但是明明这道题是三块披萨一拿啊&#xff0c;打家劫舍是相邻不能拿&#xff0c;还是不一样啊。 这块证明挺难的&#xff0c;但是我可以用个简单的例子…

MicroPython-On-ESP8266——8x8LED点阵模块(1)驱动原理

MicroPython-On-ESP8266——8x8LED点阵模块&#xff08;1&#xff09;驱动原理 1. 8x8LED点阵模块介绍 1.1. 显示模块的升级 之前已经试过点亮8段数码管&#xff0c;并能够使用两片HC595芯片来驱动数码管。今天我又找来了一个8x8点阵LED屏&#xff0c;下面分析一下这个屏幕并…

【用户画像】Redis的简介和安装

文章目录一 Redis简介1 应用场景&#xff08;1&#xff09;业务系统&#xff1a;配合关系型数据库做高速缓存&#xff08;2&#xff09;大数据场景&#xff1a;缓存数据&#xff08;3&#xff09;大数据场景&#xff1a;临时数据&#xff08;4&#xff09;大数据场景&#xff1…

【计算机毕业设计】医院管理系统源码

一、系统截图&#xff08;需要演示视频可以私聊&#xff09; 一&#xff0e;摘要 目前各医疗机构中&#xff0c;绝大部分中小型医疗机构内部没有实现任何信息化管理&#xff0c;医院临床信息&#xff0c;业务流程的数据依然采取纸质记录&#xff0c;造成数据容易丢失&#xff…

CCSP通过经验 | 讲义覆盖的知识点更全面(含题型分析)

我一直就职于国内网络安全乙方&#xff0c;自2014年接触云安全后&#xff0c;一直希望能获取一个比较官方的云安全从业水平的资格证书。 在横向比较了如腾讯云、华为云、阿里云以及国外如亚马逊云认证后&#xff0c;在没有明确就职意向的情况下&#xff0c;选择了ISC2的认证资…