【动态规划算法】第三题:746.使用最小花费爬楼梯

news/2024/11/23 5:28:09/

💖作者:小树苗渴望变成参天大树
🎉作者宣言:认真写好每一篇博客
🎊作者gitee:gitee
💞作者专栏:C语言,数据结构初阶,Linux,C++ 动态规划算法
在这里插入图片描述
如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧!

文章目录

  • 前言


前言

今天我们开始讲解动态规划的第三题,难度上有一点小提升,不太很好理解,这题目有两种解题办法,博主都会使用动态规划的五个步骤给大家进行讲解,我们来看下面的正文


第二个题目是使用最小花费爬楼梯
在这里插入图片描述

解法一:(以i为到达点,通过前面的费用来推后面的)
图解:
在这里插入图片描述
通过动态规划的五个步骤解题:

  1. 状态表示:创建一个dp表,根据经验以i位置为到达点,即到达第i个台阶需要花费的最小费用为dp[i](注意:i位置的费用不用计算,只有往上走才需要算)。 根据图解,就是当i=2时,到达第二阶台阶所花费的最小费用为dp[i]
  2. 状态转移方程:以离此状态最近的状态来研究两者的关系。到达第i的位置时,最近时先到达i-1的位置或者到达i-2的位置,来算算两者谁到达i位置的费用最低,通过状态表示,dp[i]表示到达i位置的最小费用,
    (1)那么从i-1的位置到达i位置的最小费用为dp[i-1]+往上爬一步所需的费用为cost[i-1]。 dp[i]=dp[i-1]+cost[i-1]
    (2) 同理,那么从i-2的位置到达i位置的最小费用为dp[i-2]+往上爬两步所需的费用为cost[i-2]。 dp[i]=dp[i-2]+cost[i-2]
    所以状态转移方程为两者最小的:dp[i]=min(dp[i-1]+cost[i-1],dp[i]=dp[i-2]+cost[i-2])
  3. 初始化:保证数组不越界,出现i-1和i-2,所以dp[0],dp[1]要初始化从dp[2]开始算,根据题目要求,到达第0阶或者到达第1阶不需要费用,所以dp[0]=dp[1]=0;
  4. 填表顺序:从左往右
  5. 返回值,根据题目要求和状态表示,dp[n]就是到达第n阶台阶的最小费用

代码实现:

class Solution {
public:int minCostClimbingStairs(vector<int>& cost) {int n=cost.size();//计算cost数组的大小//1.创建dp表vector<int> dp(n+1);//vector默认给数组的初始化就是0for(int i=2;i<=n;i++){dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);}return dp[n];//返回值}
};

解法二:(以i位置为出发点,到达楼顶的最小费用,通过后面来推前面)
图解
在这里插入图片描述
通过动态规划的五个步骤解题:

  1. 状态表示:根据解法一,创建一个dp表,以i位置为出发点,dp[i]表示:从i位置到达楼顶的最小费用。因为从n-1h和n-2位置开始到楼顶的最小费用是直接可以得出来的,第n个位置的费用就可以不用计算了,所以dp表的大小和原数组大小一样即可
  2. 状态转移方程:通过状态表示第i位置到达了,楼顶的最小费用为dp[i],从i位置出发,想要到达楼顶,右两种方式
    (1)先支付cost[i],往后面走一步,到达i+1的位置,i+1到达楼顶的最小费用是知道的为dp[i+1],所以从i位置到达楼顶的费用为dp[i]=dp[i+1]+cost[i]
    (2)同理,先支付cost[i],往后面走两步,到达i+2的位置,i+2到达楼顶的最小费用是知道的为dp[i+2],所以从i位置到达楼顶的费用为dp[i]=dp[i+2]+cost[i]

所以从i位置到达楼顶的最小费用为dp[i]=min(dp[i+1]+cost[i],dp[i+2]+cost[i])
3. 初始化:保证数组不越界,可以楼顶到前一步或者前两部达到楼顶的最低费用为dp[n-1]=cost[n-1],dp[n-2]=cost[n-2]
4. 填表顺序:从右往左
5. 返回值:我们是从后面往前面推,一开始出发右两种方式,就是从0阶或者1阶出发,比较两者谁的费用最小即可,即返回min(dp[0],dp[1]);

代码实现:

class Solution {
public:int minCostClimbingStairs(vector<int>& cost) {int n=cost.size();//计算cost数组的大小//1.创建dp表vector<int> dp(n);//vector默认给数组的初始化就是0if(n==0||n==1)return 0;dp[n-1]=cost[n-1];//初始化dp[n-2]=cost[n-2];for(int i=n-3;i>=0;i--)dp[i]=min(dp[i+1]+cost[i],dp[i+2]+cost[i]);//状态转移方程return min(dp[0],dp[1]);//返回值}
};

运行结果:
在这里插入图片描述

今天的动态规划第三题就讲解结束了,大家是不是感觉难度有所提升,博主也是想了一会,才尽可能用大家理解的方式把细节将出来,希望大家明白,不懂的可以评论区留言哦,我们下道题目再见
在这里插入图片描述


http://www.ppmy.cn/news/715188.html

相关文章

多肽试剂:151308-48-4,分子式C117H149N27O28,分子量2381.6,具有一定的稳定性

【产品描述】 多肽试剂&#xff08;CAS&#xff1a;151308-48-4&#xff09;一般多肽可以作为螯合剂进行科研实验&#xff0c;一般多肽试剂与其他肽类物质相同&#xff0c;多肽能完全溶解于水&#xff0c;具有一定的稳定性&#xff0c;酸&#xff0c;热组分不改变&#xff0c;…

PC 3D显卡

一块700 RMB左右的PC电脑显卡&#xff0c;已经可以这样绘制实时3D图像了&#xff1a; 录像&#xff1a; http://218.106.254.201/download/gpu_face.wmv pic&video from <GPU GEMS III> by NVIDIA

windows10下基于3070显卡安装 mmdetection+mmcv_full

windows10下基于3070显卡安装 mmdetectionmmcv_full ​ 3070显卡的算力是8.6&#xff0c;支持的cuda版本按照正常情况&#xff0c;应该只支持cuda11以上版本&#xff0c;但是mmcv_full官方提供的下载地址没有在windows平台下编译好的基于cuda11的版本&#xff0c;所以需要在wi…

英伟达 Magic3D:一句话生成3D模型,分辨率清晰8倍,速度快2倍,编辑文本还可直接修改...

丰色 发自 凹非寺 量子位 | 公众号 QbitAI 一句话生成3D模型&#xff0c;英伟达也来“秀肌肉”了&#xff5e; 来看它最新捣鼓出的Magic3D AI&#xff0c;效果是这样儿的。 输入“坐在睡莲上的蓝色箭毒蛙”&#xff0c;就能得到这样一个细节丰富的3D模型&#xff1a; “摆满了…

至尊无上“武林神话”——下载最强3dmax插件神器|高效顶级3dmax插件神器“王者荣耀”加冕?满血拉二胡,开挂横着走!

找各种软件、办公、装机帮助手册——点击进入引申热文——各行业软件大全更新中【19年11月“一设计群”整理】 上为设计办公系统装机自助方法步骤手册&#xff08;每个版本进入后都有下载链接&#xff0c;请选中后复制到浏览器、再输入提取码下载&#xff09;。下为正文内容&am…

FairMOT配置(笔记本3060显卡+VS2017+Win10+CUDA11.1)

来记录一下自己艰难的配置过程。 配置环境 Win10 VS2017 CUDA11.1 Pytorch1.7 配置步骤&#xff1a; 1、vs2017安装 安装vs2017community版本&#xff0c;默认路径安装&#xff0c;只安装了红框中的“使用C的桌面开发”。 安装完成后&#xff0c;环境变量的配置如下。W…

3DMAX下载、3dmax2014下载、3dmax2020下载亲测有效

3DMAX下载-3dmax2014-2020下载 提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 3DMAX下载、3dmax2014下载、3dmax2020下载亲测有效一、3dmax是什么&#xff1f;二、3dmax2014-3dmax20201.下载链接2.安装教程 总结 …

Python递归算法从入门到精通

递归是一种常见且重要的算法设计和解决问题的方法。它通过将问题分解为规模更小的子问题&#xff0c;并通过解决子问题来解决原始问题。递归算法的关键在于找到递归终止条件和递归调用的方式。本文将介绍递归的基本原理、应用场景&#xff0c;并通过相关的Python代码示例详细讲…