动态规划(算法)---03.斐波那契数列模型_最小花费爬楼梯

news2024/12/25 0:15:05

题目链接:

746. 使用最小花费爬楼梯 - 力扣(LeetCode)icon-default.png?t=O83Ahttps://leetcode.cn/problems/min-cost-climbing-stairs/description/

一、题目解析

题目:

解析:

  题目说cost[i]为从某一个台阶向上爬的的费用,我们只要支付这个费用,就可以选择向上爬一或两个台阶,求爬到顶部的最小费用

  这里有一个易错点:容易把最后支付费用的台阶当成楼顶,我们通过示例1知道,一共有三个台阶,我们在第二个台阶向上爬仍然需要两步,所以说最后一个台阶的后面才是楼顶!

我们从第一个台阶或者第二个台阶出发,每次都选择最小花费直达终点得到的最小花费才是我们想要的答案

二、算法原理

1、状态表示

我们在状态标识的时候,一般都会创建一个数组dp,也就是我们所说的dp表,我们要做的就是把每一个状态的值填入这个表内,最终这个表内的某一个值可能就是我们要返回的值。 

  状态简单理解就是dp表内某一个值代表的含义。

如何确定状态表示

  • 题目要求

   简单的题目里一般会给出

  • 经验+题目要求

  越学越深入,动态规划也是熟能生巧,在题目中没有明显给出的时候,我们就要凭借自己做题的经验来确定,所以就需要我们大量的做题。

  • 分析问题的过程中,发现重复子问题

分析问题的过程中把重复子问题抽象成我们的状态表示,这个更难理解,一切的基础都是我们先对动态规划算法熟练运用。我也不懂,我们慢慢来。

那我们这道题的状态表示应该是是什么样的,是以一个位置为结尾开始算起呢,还是以一个位置为开始?

这道题两种状态都可以,我们都给大家讲解一下:

以一个位置为结尾:dp[i]表示:到达i位置时的最小花费  

以一个位置为结尾:dp[i]表示:从i位置开始,到达楼顶,此时的最小花费

2、状态转移方程

 确定状态表示之后我们就可以根据状态标识推出状态转移方程

  状态转移方程是什么?

不讲什么复杂的,简单来说状态转移方程就是    dp[i]等于什么 dp[i]=?

  这个就是状态转移方程,我们要做的,就是推出dp[i]等于什么

  我们根据状态表示再结合题目+经验去推理转移方程,这一步也是我们整个解题过程中最难的一步

  我们在这道题先简单了解下什么是状态转移方程,之后比较难的题目再细推

  在这道题中,我们应该用之前或者之后的状态,推导出dp[i]的值

以一个位置为结尾:

  根据最近的一步,来划分问题:

我们知道,dp[i]表示,到达i位置时的最小花费,但在i位置之前,又有两种状态:

  • 从i-1位置花费cost[i-1]走一步到达i
  • 从i-2位置花费cost[i-2]走两步到达i

我们要从两种状态中选出到达i位置的最小花费,那么我们就需要选出到达i-1和i-2位置的最小花费

i-1和i-2位置的最小花费是:dp[i-1]和dp[i-2]

从中选出i位置的最小花费,那么我就就需要比较 dp[i-1]+cost[i-1]与dp[i-2]+cost[i-2]的大小!

那么我们的状态转移方程就确定:dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])

以一个位置为开始:

我们知道,dp[i]表示从i位置开始,到达楼顶,此时的最小花费。但在i位置之后,又有两个状态:

  • 在i位置支付cost[i]往后走一步到i+1的位置
  • 在i位置支付cost[i]往后走两部到i+2的位置

我们要从两种状态中选出此时i位置的最小花费,那么我们就需要选出i-1和i-2位置此时的最小花费

cost[i]是一定的,我们只需要选出i+1或者i+2位置到达楼顶的花费最小就行了

即是dp[i+1]和dp[i+2]

从中选出i位置的最小花费,那么我就需要比较 dp[i-1]+cost[i-1]与dp[i-2]+cost[i-2]的大小!

那么我们的状态转移方程就确定:dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])

3、初始化

 我们创建dp表就是为了把他填满,我们初始化是为了防止在填表的过程中越界

怎么谈越界?

如果我们从第一个台阶或者第二个台阶开始填,那dp[i-1]与dp[i-2]会越界!

 以一个位置为结尾:

  我们需要给dp表初始化为0,由cost数组中的花费来填写dp表

如果我们从最后一个台阶或者倒数第二个台阶开始填,那dp[i+1]和do[i+2]会越界

 以一个位置为开始:

我们需要给dp表最后两个数进行初始化,即是最后一个台阶或者倒数第二个台阶到达楼顶的最小花费

4、填表顺序

 以一个位置为结尾:

我们需要先知道dp[i-1]与dp[i-2]的值,才能得到dp[i]的最小花费,所以我们需要从左到右挨个填写!

 以一个位置为开始:

我们需要先知道dp[i+1]与dp[i+2]的值,才能得到dp[i]的最小花费,所以我们需要从右到左挨个填写!

5、返回值

以一个位置为结尾:

 返回dp[i]即可,此时i表示为楼顶

 以一个位置为开始:

因为我们所求的是从i位置开始网上爬,此时i位置的最小花费,我们最开始是在第一个台阶或者第二个台阶中选择一个向上怕的,所以当我们填表顺序完成之后,我们需要在dp[0]与dp[1]中再选择一个最小花费,即:min(dp[0],dp[1])

三、编写代码

以一个位置为结尾:

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        int n=cost.size();
//1、创建dp表,大小设置为n+1,是因为楼顶在最后一个台阶之后!
        vector<int> dp(n+1);
//2、这里初始化省去了,因为我们只需要将dp表内元素置零,在创建dp表时就可以做到
//3、填表顺序,从第三个台阶开始填,否则会越界
        for(int i=2;i<n+1;i++)
        {
            dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
        }
//4、返回值为楼顶,第n+1个元素
        return dp[n];
    }
};

 以一个位置为开始:

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        int n=cost.size();
        //1、创建dp表,这里的大小为n,是因为我们不用从楼顶再往上爬
        vector<int> dp(n);
        //2、初始化
        dp[n-1]=cost[n-1];
        dp[n-2]=cost[n-2];
        //3、填表顺序,从右到左
        for(int i=n-3;i>=0;i--)
        {
            dp[i]=min(dp[i+1]+cost[i],dp[i+2]+cost[i]);
        }
        //4、返回值
        return min(dp[0],dp[1]);
    }

       

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

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

相关文章

基于SpringBoot+Vue+MySQL的房屋租赁管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 二十一世纪互联网的出现&#xff0c;改变了几千年以来人们的生活&#xff0c;不仅仅是生活物资的丰富&#xff0c;还有精神层次的丰富。在互联网诞生之前&#xff0c;地域位置往往是人们思想上不可跨域的鸿沟&#xff0c;信息的…

不可错过的10款电脑监控软件,电脑监控软件推荐收藏

随着科技的飞速发展&#xff0c;企业和个人对电脑监控软件的需求也越来越大。这类软件不仅可以帮助企业有效监控员工工作状态&#xff0c;提高工作效率&#xff0c;还能确保信息安全&#xff0c;防止数据泄露。本文将为您推荐10款不可错过的电脑监控软件&#xff0c;帮助您提升…

VS Code 配置 Rust-Analyzer 报错

报错信息&#xff1a; Bootstrap Error" rust-analyzer requires glibc > 2.28 in latest build. 参考了好多地方&#xff0c; https://github.com/rust-lang/rust-analyzer/issues/11558 https://blog.csdn.net/aLingYun/article/details/120923694 https://rust-anal…

通过IDEA的Maven插件清理maven依赖缓冲

问题 有时候&#xff0c;在IDEA编程的时候&#xff0c;会遇到2个服务都依赖同一个模块&#xff0c;但是&#xff0c;其中有1个服务没有生效&#xff0c;但是&#xff0c;在CLI的maven中检查依赖树&#xff0c;没有任何问题&#xff0c;但是在IDEA中那个服务始终就是没有生效。…

电子发票二维码识别内容解析大全

一、发票二维码信息解析 增值税发票有一个二维码&#xff0c;此二维码通过扫码识别可获取对应信息&#xff0c;随便扫个增值税普通纸质发票二维码获取如下&#xff1a; 01,10,037002300113,01963246,199.27,20240531,14567244254499868363,Cxx0, 那么这一次数字字符具体表示什…

[网络]从零开始的计算机网络基础知识讲解

一、本次教程的目的 本次教程我只会带大叫了解网络的基础知识&#xff0c;了解网络请求的基本原理&#xff0c;为后面文章中可能会用到网络知识做铺垫。本次我们只会接触到网络相关的应用层&#xff0c;并不涉及协议的具体实现和数据转发的规则。也就是说&#xff0c;这篇教程是…

短信群发在销售中起到了什么作用

短信群发可以精确定位每个地域&#xff0c;每个交易人群的数据信息&#xff0c;接下来我们为大家详细讲解下短信群发在产品销售中起到的作用。 ‌品牌形象口碑提升‌&#xff1a;通过短信群发&#xff0c;企业能够提供目的性的人性化服务&#xff0c;从而提高在客户心目中的品牌…

编程新纪元:AI如何成为你的编程伙伴

随着人工智能技术的不断进步&#xff0c;我们正步入一个编程的新纪元。在这个时代&#xff0c;AI不仅仅是一个工具&#xff0c;更是程序员的伙伴。它通过提供智能辅助、自动化编码和增强开发效率&#xff0c;正在改变我们编写和理解代码的方式。本文将探讨AI如何成为程序员的得…

怎么将几个pdf合成为一个?把几个PDF合并成为一个的8种方法

怎么将几个pdf合成为一个&#xff1f;将多个PDF文件合并成一个整体可以显著提高信息整合的效率&#xff0c;并简化文件的管理与传递。例如&#xff0c;将不同章节的电子书合成一本完整的书籍&#xff0c;或者将多个部门的报告整合成一个统一的文档&#xff0c;可以使处理流程变…

浙江: 策马扬鞭自奋蹄 头雁领航新征程

建德市心手相牵社会工作服务中心当选杭州市社会组织总会理事单位、王江平同志当选为理事 作者:李望 牧凡 金秋九月,杭州市社会组织领域迎来了一场盛会。2024年9月10日,杭州市社会组织总会第四届一次会员大会在杭州之江饭店胜利召开,会议汇聚了浙江省及杭州市民政系统的重要领导…

基于监测成果的黄金坪水电站高边坡支护方案-峟思

在黄金坪水电站引水隧洞及泄洪洞进口工程边坡的变形监测过程中&#xff0c;积累了大量宝贵的数据。本文基于这些监测成果&#xff0c;对边坡的变形深度进行了深入分析&#xff0c;并据此提出了支护方案的优化建议。 一、监测成果概览 截至2012年2月&#xff0c;多点位移计和外部…

如何在Windows系统上使用谷歌浏览器进行远程工作

对于许多专业人士而言&#xff0c;远程工作已成为常态&#xff0c;而选择一个合适的浏览器并配置好相关设置是提升线上工作效率的关键。本文重点介绍如何在Windows系统上通过谷歌浏览器实现高效远程工作&#xff0c;希望对你有所帮助。&#xff08;本文由https://chrome.polamu…

blender我的对称模型好像中点被我不小心移动了 我现在如果雕刻 两边修改的地方不是对称的 我该怎么办

blender我的对称模型好像中点被我不小心移动了 我现在如果雕刻 两边修改的地方不是对称的 我该怎么办 首先请调整好模型确保左右前后对其相应的xyz轴 之后CtrlA应用变换 确保这些都归0且模型和xyz轴对应 如果在Blender中模型的中点&#xff08;对称轴&#xff09;不小心被移动了…

【机器鱼设计学习1】——电子控制单元

总结自B站UP主“RC扫地僧” 一、电池 电池容量&#xff1a; ① 5000mAh用5000mA&#xff08;5A&#xff09;放电&#xff0c;1h放完电 ② 锂聚合物电池的标准电势电压为1S3.7V&#xff08;相应的2S7.4V&#xff0c;3S11.1V&#xff09; ③ 若用单片电芯组成的一组电池&#xf…

云电脑玩《黑神话:悟空》游戏到底咋样?说说心里话…

前言 最近《黑神话&#xff1a;悟空》游戏真的很火很火&#xff0c;小白在刷抖音的时候&#xff0c;十个中有七八个是直接在直播玩这款国产3A大作。 小白也是特别迷恋这个游戏的&#xff0c;以至于玩到公众号都忘记更新。 今天咱们就来聊聊&#xff1a;手边没有适合的电脑设…

彻底解决win10出现锁屏异常,需按下Ctrl + Alt + Del解锁

1 锁屏时间修改 此环节容易被忽视&#xff0c;在网络上寻找解决方案时也并未找到相关内容。这可能导致在修改完其他设置后&#xff0c;电脑静止不动数分钟后会突然闪烁&#xff0c;随后重新跳转至需要验证登录的界面。 # 2 Mouse Border相关设定关闭 经过仔细对比分析发现&am…

自掘坟墓?开源正在卷爆程序员!

前端训练营&#xff1a;1v1私教&#xff0c;终身辅导计划&#xff0c;帮你拿到满意的 offer。 已帮助数百位同学拿到了中大厂 offer Hello&#xff0c;大家好&#xff0c;我是 Sunday。 今天这篇文章其实我想了好久&#xff0c;因为这并不是一个 和光同尘 的话题&#xff0c;它…

ML20_贝叶斯模型平均BMA详解

1. BMA贝叶斯模型平均 “贝叶斯模型平均”&#xff08;Bayesian Model Averaging, BMA&#xff09;是一种统计方法&#xff0c;用于处理模型不确定性的问题。在传统的统计建模过程中&#xff0c;研究者通常会选择一个最佳模型来进行推断或预测&#xff0c;而这个最佳模型通常是…

[001-03-007].第26节:分布式锁迭代3->优化基于setnx命令实现分布式锁

我的博客大纲 我的后端学习大纲 1、死锁问题&#xff1a; setnx刚刚获取到锁&#xff0c;当前服务器宕机&#xff0c;导致del释放锁无法执行&#xff0c;进而导致锁无法锁无法释放&#xff08;死锁&#xff09; 2、解决办法&#xff1a; 解决&#xff1a;给锁设置过期时间&…

2024年度建筑工程中级、副高职称水平能力测试合格人员公示啦

目前副高水测考过有1016名人员 中级水测考过人员有75人 为什么省直副高和中级相差人员那么多&#xff1f;想知道原因嘛&#xff1f;评论区聊一下