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

news/2024/9/18 12:38:55/ 标签: 算法, 动态规划

题目链接:

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.ppmy.cn/news/1524388.html

相关文章

黑马点评18——多级缓存-OpenResty

文章目录 安装OpenRestyOpenResty快速入门OpenResty获取请求参数封装Http请求向Tomcat发送http请求根据商品id对tomcat集群负载均衡Redis缓存预热查询Redis缓存Nginx本地缓存 安装OpenResty 安装参考博客 OpenResty快速入门 nginx是没有业务能力的&#xff0c;我们是把请求转发…

【精彩瞬间】2024外滩大会回顾

9月8号&#xff0c;为期3天的“2024 inclusion外滩大会”在上海黄浦圆满落下帷幕。本届大会&#xff0c;共吸引了5.2万人到场参观&#xff0c;无论是参会规模还是国际嘉宾的数量都创下历史新高。 500位演讲嘉宾分别在1场开幕主论坛、36场见解分论坛上聚焦“ai产业新实践”“科技…

再获新认可!创客匠人被评2024年度腾讯云教育行业“最佳新锐奖”

近日&#xff0c;2024腾讯全球数字生态大会在深圳国际会展中心举行。知识变现整体解决方案服务商创客匠人受邀参会&#xff0c;并凭借其卓越的创新能力和显著的市场成绩荣获2024年度腾讯云教育行业“最佳新锐奖”。 这一荣誉不仅是对创客匠人在知识服务领域持续深耕与探索的充…

git-repo使用

即使用 XML 格式文件&#xff08;manifest 清单文件&#xff09;定义一个项目的多仓库关联&#xff0c;然后用 repo 客户端工具操作多仓库 git repo命令行格式&#xff1a; git repo <子命令> <参数>创建一个空目录&#xff0c;作为工作区。 $ mkdir workspace$ …

AI教程_AI大模型 Prompt提示词工程 Langchain AI原生应用开发视频教程分享(IT营)

AI&#xff08;人工智能&#xff09;正在以惊人的速度席卷着各行各业&#xff0c;其影响深远且广泛。十九大开幕式把人工智能列入了报告内容&#xff0c; 普京表示过人工智能是整个人类的未来&#xff0c;马斯克说人工智能有可能是人类科技的终极战场。雷总说过一句话&#xff…

Ribbon快速了解

Ribbon 一、Ribbon 介绍 Ribbon 是一个客户端负载均衡器&#xff0c;它是 Netflix 开源的一个组件&#xff0c;常与 Spring Cloud 一起使用。 二、Ribbon 的作用 客户端负载均衡 Ribbon 可以在客户端实现负载均衡&#xff0c;即在服务消费者端根据一定的算法从多个服务提供者实…

如何使用Docker快速启动Nginx服务器

Nginx 是一款高性能的 HTTP 和反向代理服务器&#xff0c;它以高稳定性、丰富的功能集、简单的配置和低资源消耗而闻名。Docker 是一个开源的应用容器引擎&#xff0c;可以让开发者打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上…

JavaScript第五天(函数,this,严格模式,高阶函数,闭包,递归,正则,ES6)高级

这里写目录标题 JavaScript高级第03天1.函数的定义和调用1.1函数的定义方式1.2函数的调用 2.this2.1函数内部的this指向2.2改变函数内部 this 指向2.2.1 call方法2.2.2 apply方法2.2.3 bind方法2.2.4 call、apply、bind三者的异同 3.严格模式3.1什么是严格模式3.2开启严格模式3…

微服务重构:Mysql+DTS+Kafka+ElasticSearch解决跨表检索难题

1、背景 在微服务拆分过程里&#xff0c;会对数据库模块重新进行建模拆分&#xff0c;导致部分表和数据&#xff0c;出现物理隔离&#xff0c;导致跨库JOIN的SQL不可行&#xff0c;并在数据检索上也有性能损耗的风险。下面我们来一起探讨一下&#xff0c;具体的解决方案。 1.1 …

《食品安全导刊》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答 问&#xff1a;《食品安全导刊》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的正规学术期刊。 问&#xff1a;《食品安全导刊》级别&#xff1f; 答&#xff1a;国家级。主管单位&#xff1a; 中国商业联合会 主办单…

leetcode18-27

矩阵问题 18.矩阵置零 自己解法&#xff0c;空间复杂度高 自己思路写出来就好了&#xff0c;第一遍先不追求最完美。况且有时候最完美也不易读 class Solution:def setZeroes(self, matrix: List[List[int]]) -> None:"""Do not return anything, modify …

css-loader/style-loader/less-loader/sass-loader/postcss-loader各有什么作用,一次性说明白

大家都清楚在使用webpack构建前端项目时都会使用到sass-loader、less-loader、postcss-loader、css-loader、style-loader&#xff0c;但这些loader在其中起到什么作用呢&#xff1f;本篇主要阐述这些loader在打包中所扮演的角色。 概述 1、css-loader: 加载.css文件的loader&…

八戒:再不上市就要破产了!

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 这是猪八戒网刚刚发布的声明&#xff0c;热乎的&#xff0c;大概就2个意思&#xff1a; (1)猪八戒网运营正常&#xff0c;对未来整体看好。 (2)公司创始人没拿高报酬。 事情是这样的&#xff1a;8月底9月初&am…

Spring Cloud Gateway中的常见配置

问题 最近用到了Spring Cloud Gateway&#xff0c;这里记录一下这个服务的常见配置。 spring:data:redis:host: ${REDIS_HOST:xxx.xxx.xxx.xxx}port: ${REDIS_PORT:2345wsd}password: ${REDIS_PASS:sdfsdfgh}database: ${REDIS_DB:8}session:redis:flush-mode: on_savenamespa…

Vivado时序报告之Report pulse width详解

目录 一、前言 二、Report pulse width 2.1 Report pulse width 2.2 配置界面 2.3 分析结果 一、前言 在进行时序分析时&#xff0c;除了slack的分析&#xff0c;还存在pulse width的检查&#xff0c;下面将对pulse width检查进行详细说明。在report timing summary报告中…

Java语言程序设计基础篇_编程练习题*18.20 (显示多个圆)

目录 题目&#xff1a;*18.20 (显示多个圆) 习题思路 代码示例 输出结果 题目&#xff1a;*18.20 (显示多个圆) 编写一个Java程序显示多个圆&#xff0c;如图18-12b所示。这些圆都处于面板的中心位置。两个相邻圆之间相距10像素&#xff0c;面板和最大圆之间也相距10像素。…

Centos7 Hadoop 单机版安装教程(图文)

本章教程,主要记录如何在Centos7中安装Hadoop单机版。 一、软件安装包和基础环境 CentOS7.x,jdk8,hadoop 通过网盘分享的文件:Hadoop 链接: https://pan.baidu.com/s/1_qGI9QeXMAJNb3TydHhQGA?pwd=xnz4 提取码: xnz4 当然你也可以自己去官网下载。 java8:https://www.ora…

黑马点评22——最佳实践-批处理优化

文章目录 pipeline和mset集群模式下的批处理问题 pipeline和mset pipeline就是大数据量的导入&#xff0c;pipeline是在单机模式下的。 redis的处理耗时相比较网络传输的耗时其实是比较低的。 所以我们最好采用批处理&#xff0c; 集群模式下的批处理问题 在集群环境…

redis基本数据类型和常见命令

引言 Redis是典型的key-value&#xff08;键值型&#xff09;数据库&#xff0c;key一般是字符串&#xff0c;而value包含很多不同的数据类型&#xff1a; Redis为了方便我们学习&#xff0c;将操作不同数据类型的命令也做了分组&#xff0c;在官网&#xff08; Commands | Do…

Mysql树形结构表-查询所有子集数据

表结构&#xff0c;这里只是个例子&#xff0c;所有的树形结构表均可用&#xff1a; CREATE TABLE zhkt_course_chapter (id bigint NOT NULL COMMENT 唯一id,course_id bigint NOT NULL COMMENT 所属课程id,name varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general…