【手撕算法|动态规划系列No.3】leetcode746. 使用最小花费爬楼梯

news2024/9/25 21:23:28

个人主页:平行线也会相交
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创
收录于专栏【手撕算法系列专栏】【LeetCode】
🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助
🍓希望我们一起努力、成长,共同进步。
在这里插入图片描述

点击直接跳转到该题目

目录

  • 🍞题目描述
  • 🥟算法原理(解法一)
  • 🍭算法原理(解法二)
  • 🍰代码实现(解法1)
  • 🍡代码实现(解法2)
  • 🍋总结

🍞题目描述

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

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

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

输入:cost = [10,15,20]
输出:15
解释:你将从下标为 1 的台阶开始。
支付 15 ,向上爬两个台阶,到达楼梯顶部。
总花费为 15 。

示例二:

输入: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 。

🥟算法原理(解法一)

步骤1:状态表示

根据题目要求,以i位置为结尾,dp[i]表示到达i位置所需要的最小花费。

步骤2:状态转移方程

推导状态转移方程时,可以利用i位置之前或者之后的状态来进行状态转移方程的推导。以后在做动态规划的题目时,利用i位置之前或者之后的状态来进行状态转移方程的推导是一个很常见的思路方向。

现在我们进行题目的分析,我们知道dp[i]表示到达i位置需要的最小花费,其中到达i位置分为两种情况。我们先以i位置为结尾(以i位置为起点来进行分析是下面的解法二),根据最近的一步来进行题目的分析,总共分为两种情况。

情况一:从i-2位置跳两步到达i位置。
情况二:从i-1位置跳一步1到达i位置。
在这里插入图片描述
我们再来解释一下情况1、2:
情况一:我们如果想要知道到达i位置所需要的最小花费的话,首先要知道到达i-1位置所需要的最小花费(即dp[i-1]表示到达i-1位置所需要的最小花费),而cost[i-1]表示支付完cost[i-1]从i-1位置向上爬所需要的费用。
情况二:i-2位置所需要的最小花费(即dp[i-2]表示到达i-2位置所需要的最小花费),而cost[i-2]表示支付完cost[i-2]从i-2位置向上爬所需要的费用。
最终,推导出状态转移方程dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])

步骤3:初始化

初始化依然是保证填表的时候防止越界问题的产生来保证填表的时候不越界。

步骤4:填表顺序

如果想要知道dp[i]的值,就需要知道dp[i-2]和dp[i-1]的值,所以需要从左往右进行填表。

步骤5:返回值

到达楼顶就是到达下标为n的地方,返回值根据题目要求来进行返回。直接返回dp[n]就好了。

🍭算法原理(解法二)

刚刚我们是按照以i的位置为结尾进行思考分析,现在我们按照以i的位置为开头来进行思考分析。
好了,这里我们依然按照那5个步骤进行分析,请看:
步骤1:状态表示

dp[i]表示从i位置出发到达楼顶的最小花费。

步骤2:状态转移方程
在这里插入图片描述

求取这里的状态转移方程的时候依然是分为两种情况:
情况一:支付cost[i],然后走1步到达i+1,最后从i+1位置出发到达终点。
情况二:支付cost[i],然后走2步到达i+2,最后从i+2位置出发到达终点。
然而最终dp[i]的取值依然是情况1、2中的最小值。
故最终的状态转移方程为:dp[i]=min(cost[i]+dp[i+1],cost[i]+dp[i+2])

步骤3:初始化

由于我们在求取dp[i]的时候需要用到dp[i+1]和dp[i+2]的值,所以我们在进行初始化的时候需要先对后面进行初始化。
这里有一个地方需要注意:dp数组的下标应该开到n-1的位置,因为下标n的位置代表楼顶,从楼顶到楼顶不需要花费。故dp数组只需要开辟n个元素个数的空间即可
在这里插入图片描述
所以初始化时只需要初始化最后两个位置的值即可:
从n-1位置走一步直接到达楼顶只需要支付cost[n-1],从n-2位置走两步直接到达楼顶只需要支付cost[n-2]。由此我们就可以根据最后两个位置的值来推导前面位置的dp值。

步骤4:填表顺序

由上一步骤我们可以知道,我们需要根据最后两个位置的值来推导前面位置的dp值,即从后往前进行赋值。填表顺序当然也是从后往前了。

步骤5:返回值

我们最初的状态是处以0位置或者1位置的状态,所以我们需要返回这两种情况(从0位置出发还是从1位置出发)中的最小值。即返回min(dp[0],dp[1])

🍰代码实现(解法1)

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        //1.创建dp表
        //2.初始化(防止越界)
        //3.填表
        //4.返回值

        int n = cost.size();
        vector<int> dp(n+1);

        for(int i = 2;i <= n;i++)
        {
            dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
        }
        return dp[n];//下边n就是楼顶
    }
};

🍡代码实现(解法2)

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        //1.创建dp表
        //2.初始化
        //3.填表
        //4.返回值

        int n = cost.size();
        vector<int> dp(n);
        dp[n-1]=cost[n-1],dp[n-2]=cost[n-2];
        for(int i = n-3;i>=0;i--)
            dp[i]=min(cost[i]+dp[i+1],cost[i]+dp[i+2]);
        return min(dp[0],dp[1]);
    }
};

🍋总结

利用i位置之前或者之后的状态来进行状态转移方程的推导,本文使用了两种方法来解决使用最小花费爬楼梯:
第一种思路:以i位置为结尾进行分析,dp[i]表示到达i位置所需要的最小花费。状态转移方程dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])
第二种思路:以i位置为起点进行分析,dp[i]从i位置出发到达顶部所需要的最小花费。状态转移方程为dp[i]=min(cost[i]+dp[i+1],cost[i]+dp[i+2])

好了,本文就到这里啦!
再见啦友友们!!!

在这里插入图片描述

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

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

相关文章

三相电机线电流上的锯齿状高频波形的来源

三相电机的线电流上会叠加有一组锯齿状波形&#xff0c;这里&#xff0c;光标可以看到它的频率&#xff1a;这是40KHz。当前线电流基频大约35 Hz。我们把变频器载波频率切至6.0&#xff0c;小的杂波频率变至60KHz&#xff1a; 所以&#xff0c;这类波形上的一级肉眼可见的杂波是…

时间序列分解 | Matlab经验模态分解(EMD)的信号分解

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 时间序列分解 | Matlab经验模态分解(EMD)的信号分解 部分源码 %----------------------

libevent实践09:交叉编译并运行定时器测试

交叉编译 执行命令&#xff1a; ./configure --prefix/big/libevent/libevent-2.1.12-stable/_arm_install --hostarm-linux-gnueabihf CC/arm-gcc/bin/arm-linux-gnueabihf-gcc CXX/arm-gcc/bin/arm-linux-gnueabihf-g --disable-openssl ./configure --prefix/big/libevent/…

GO 多线程工具使用和分析

GO 多线程工具使用和分析 Go 语言中的 sync 包提供了一些用于同步和互斥访问共享资源的原语&#xff0c;使用这些可以避免多个goroutine同时访问共享资源时出现的问题&#xff0c;他们有&#xff1a; 互斥锁读写锁condWaitGroupmaponcepoolatomic 本文介绍它们的使用方式 互…

【海量数据挖掘/数据分析】 之 关联规则挖掘 Apriori 算法 (数据集、事务、频繁项集、关联规则、支持度、置信度)

【海量数据挖掘/数据分析】 之 关联规则挖掘 Apriori 算法 &#xff08;数据集、事务、频繁项集、关联规则、支持度、置信度&#xff09; 目录 【海量数据挖掘/数据分析】 之 关联规则挖掘 Apriori 算法 &#xff08;数据集、事务、频繁项集、关联规则、支持度、置信度&#x…

4、PCB设计快捷键与关键步骤

4、PCB设计快捷键与关键步骤 一、简介 1.1 常用快捷键&#xff1a; shiftc清除测量的结果&#xff0c;退出高亮。F2进入Board Insight查看板子的细节&#xff0c;相当于放大镜。q切换英制和米制。g切换移动的最小单位。L设置各层的颜色和显示选中元件&#xff0c;再按L是将元…

C#使用XML和Treeview结合实现复杂数据采集功能

一个项目的数据表暂时没有定下来&#xff0c;但是有了一些确定性&#xff1a;   1、比较复杂&#xff0c;可能变化&#xff1b;   2、大部分是选择项目&#xff0c;因为输入项目都差不多&#xff1b;   3、应用程序是C/S的窗体应用。   对于这样的用户需求&#xff0c;…

C++ 基础知识 面试题(一)

1.变量的声明与定义 声明&#xff1a;int x; //告诉编译器这个变量的类型和名称 定义&#xff1a;int x 0; //告诉编译器这个变量的类型和名称&#xff0c;为该变量分配内存空间&#xff0c;并初始化该变量 主要区别在于是否为变量分配内存空间 2.extern关键字 用法一&…

Apache IoTDB 论文入选数据库领域顶级学术会议 ACM SIGMOD

6 月 18-23 日&#xff0c;ACM SIGMOD 会议在美国西雅图举办。Apache IoTDB 的研究成果论文《Apache IoTDB: A Time Series Database for IoT Applications》在大会做了报告&#xff0c;并进行了 Poster 展示。 01 关于 SIGMOD SIGMOD 数据管理国际会议&#xff08;Special Int…

嵌入式系统BSP开发(二)

快递拿到R16的开发板后&#xff0c;通过官方拿到SOCHIP的相关资料&#xff0c;压缩包的名称是lichee.tar.gz 一&#xff0c;解压相关的资料 tar xzvf r16_lichee.tar.gz 解压后得到的资料如下&#xff1a; yveyve:/data/home/yve/Linux/lichee$ ls brandy buildroot build…

计算物理专题:傅里叶变换与快速傅里叶变换

计算物理专题&#xff1a;傅里叶变换与快速傅里叶变换 傅里叶变换提供一个全新的角度去观察和描述问题&#xff0c;如在量子力学中&#xff0c;动量与坐标表象之间的变换就是傅里叶变换。傅里叶变换同意可以用在数据处理等领域。1965年&#xff0c;Cooley 和 Tukey 提出了快速傅…

redis之主从复制、哨兵、集群

文章目录 一、redis的高可用1.1 redis高可用的概念1.2 Redis的高可用技术 二、redis 主从复制2.1主从复制的原理2.2搭建Redis 主从复制 三、Redis 哨兵模式3.1搭建Redis 哨兵模式3.2启动哨兵模式3.3查看哨兵信息3.4故障模拟 四、Redis 群集模式4.1搭建Redis 群集模式 一、redis…

数据结构--串的定义和基本操作

数据结构–串的定义和基本操作 注:数据结构三要素――逻辑结构、数据的运算、存储结构&#xff08;物理结构) 存储结构不同&#xff0c;运算的实现方式不同 \color{pink}存储结构不同&#xff0c;运算的实现方式不同 存储结构不同&#xff0c;运算的实现方式不同 串的定义 串 …

用Java制作简单的记事本

目录 前言 主界面设计 功能实现 打开 另存为 保存 查找 替换 成员变量 其他方法 警告弹窗 不移动光标更新文本框内容 源代码 总结 转载请注明出处&#xff0c;尊重作者劳动成果。 前言 考完试想写敲一下代码就写了一下这个程序&#xff0c;整个也是写了怎么久…

JavaEE语法第二章之多线程(初级一)

一、认识线程 1.1线程的概念 一个线程就是一个 "执行流"。每个线程之间都可以按照顺序执行自己的代码. 多个线程之间 "同时"执行着多份代码。 一家公司要去银行办理业务&#xff0c;既要进行财务转账&#xff0c;又要进行福利发放&#xff0c;还得进行缴…

Docker常见问题集合

一、Docker安装 1、yum 安装 1&#xff09;更新yum包到最新 yum update2&#xff09;安装软件需要的软件&#xff0c;yum-util&#xff08;提供 yum-config-manager 功能&#xff09;&#xff0c;device-mapper-persistent-data、lvm2&#xff08;devicemapper 驱动依赖&…

mmdetection踩坑记录

1.mmcv-full和mmdetection的版本匹配问题 Readme里应该会给可复现的版本&#xff0c;一定要按照readme里的&#xff0c;这里是一些版本对应关系&#xff0c;像我的mmdet是2.3.0&#xff0c;我就只能装1.0.5的mmcv-full 表格来源&#xff1a;https://blog.csdn.net/qq_55957975/…

高频-测试岗面试题,软件测试面试常问面试题(付答案)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 测试流程&#xf…

【Zynq】Xilinx SDK设置编码方式

举例&#xff1a;将Xilinx SDK设置为UTF-8编码 工具栏->Window->Preferences

基于Tensorflow和Keras实现卷积神经网络CNN并进行猫狗识别

文章目录 一、环境配置1、安装Anaconda2、配置TensorFlow、Keras 二、猫狗数据集分类建模3.1 猫狗图像预处理3.2 猫狗分类的实例——基准模型3.1 构建神经网络3.2 配置优化器3.3 图片格式转化3.4 训练模型3.5 保存模型3.6 可视化 三、数据增强四、dropout 层五、参考资料 一、环…