【算法练习Day32】 斐波那契数爬楼梯使用最小花费爬楼梯

在这里插入图片描述

​📝个人主页:@Sherry的成长之路
🏠学习社区:Sherry的成长之路(个人社区)
📖专栏链接:练题
🎯长路漫漫浩浩,万事皆有期待

文章目录

  • 斐波那契数
  • 爬楼梯
  • 使用最小花费爬楼梯
  • 总结:

终于来到了动态规划,传说中的神奇算法,也是好多人闻声色变的一种难以被真正理解的算法。

同样的我们仍然采用循序渐进的由浅入深式的做题,来帮助我们更好的理解和接触动态规划。

首先动态规划算法,可以解决哪些类型的问题呢?

主要有买卖股票问题,子序列问题,打家劫舍问题,背包问题等问题,动态规划主要是用来解决某一问题可以由多个重叠的子问题组成时,优先选用动态规划,动态规划的每一个状态都是由上一个状态所推导出来的,是有理有据的。

解题套路

动态规划类题目都可以分解为五部曲

即:设置dp数组,找出递推公式,将dp数组部分初始化,明确遍历顺序,打表dp数组。

设置dp数组,要求我们明确dp数组在本题中的具体含义是什么,dp[i]是什么i又是什么。

递推公式通常是由题目已知量推导求得的,通常具有规律性的举例数字带入,可以帮助我们容易的确定递推公式。

将dp数组部分初始化,是根据题意的要求,将题目里已经给出的数据,初始化在dp数组中,这也和递推公式有关,一般要满足初始化的数据数量足够让递推公式推出下一个数据。

明确遍历顺序,就是要知道我们通过什么样的顺序,是从前到后还是从后向前的写一个循环,通过循环和递推公式在遍历顺序的作用下,填写dp数组。遍历顺序并不一定总是从前向后的。

最后一步,实际上是排错的,也就是题目无法ac时候,我们可以将dp数组最后的值全部打印出来,用来对比题中测试用例,用以排错。

了解了这些步骤后,相信大家能够更好的学习动态递归的算法,即使是简单题也按照这一思路来思考,这样培养出感觉了之后,遇到困难题,才能有基本的思路。

斐波那契数

509. 斐波那契数 - 力扣(LeetCode)
在这里插入图片描述

斐波那契数算是比较经典的题目了,相信大家在一开始学习递归的时候,就接触过这道题,递归思路也是十分简单,但是值得注意的是,当我们要求的第n个数字如果n非常大,那么递归是无法完成的,我们要选用更加高效的动态规划。

基本思路就是用数组dp来记载每个数的值,我们在填写第n个数字时,是前两个数字相加的和,这一个规律就是递推公式,这道题目已经将递推公式给出来了,所以我们不用找规律验证了。dp[i]代表了第i个斐波那契数,i就是代表第几个,我们初始化就是将第0个数字初始化为0第一个初始化为1,这都是题目里给出的,第0个由于没有数所以赋值0。遍历顺序很明显一定是从前向后,因为我们后一个数是前两个数和得到的。知道了这些,代码就不难写出来了。

class Solution {
public:int fib(int n) {if(n<=1)return n;int dp[n+1];dp[0]=0;dp[1]=1;for(int i=2;i<=n;i++){dp[i]=dp[i-1]+dp[i-2];}return dp[n];}
};

我们还可以使代码更精简一些,由于我们只需要维护三个数字,第n个斐波那契数,第n-1个数和第n-2个数字,我们以这种思想来写题解的话,就可以不用数组来保存前面的数字了,使空间复杂度变成了O(1)。思路就是创立三个变量,来分别保存这些信息,最后返回,这里不给出代码了。

class Solution {
public:int fib(int N) {if (N <= 1) return N;int dp[2];dp[0] = 0;dp[1] = 1;for (int i = 2; i <= N; i++) {int sum = dp[0] + dp[1];dp[0] = dp[1];dp[1] = sum;}return dp[1];}
};

爬楼梯

70. 爬楼梯 - 力扣(LeetCode)
在这里插入图片描述

这道题是一道很适合入门的动态递归题目,问到n阶台阶共有几种走法,这道题没有做过的话,应该没有什么好的思路,看着很懵,但实际上和上一道题斐波那契数列差不多。

为什么这么说呢?我们每次只能走一步或者两步台阶,而走到第n阶的情况实际上可以等价于走到n-1阶后再走一阶达到目的地,也可以是走到n-2阶后再走两阶达到,那第一种我们可以理解,第二种n-2阶时候,可以走一阶再走一阶达到目的地吗?其实这样走的话,实际上就是n-1阶了,n-2走一步到n-1。所以我们走到第n阶思路就明确了,就是n-1阶的种数加上n-2阶种数就是走到第n阶总数,这一点和斐波那契数是一样的求法,实际上代码也是差不多的,唯一不同的就是dp数组的初始化部分,第1层就是1,第一层只有一种解法,而第二层有两种解法。

那有的同学要问了,为什么没有第0层了?实际上这道题有没有第0层影响都不大,由于是类似斐波那契数列解法,我们直接给出两个初始化能够求得剩余的就可以了,至于斐波那契那道题,0这个数也可以不赋值,采用1,2下标位置赋值成1也是可以的。

class Solution {
public:int climbStairs(int n) {if(n<=2)return n;int dp[n+1];dp[1]=1;dp[2]=2;for(int i=3;i<=n;i++)dp[i]=dp[i-1]+dp[i-2];//实际上是dp[i-1]再上一层楼梯和dp[i-2]再上两层楼梯,dp[i-2]如果只上一层楼梯那么和dp[i-1]就一样了,所以不算return dp[n];}
};

使用最小花费爬楼梯

746. 使用最小花费爬楼梯 - 力扣(LeetCode)
在这里插入图片描述

这道题就相当于爬楼梯的消费版,虽然是这样说,但实际上还是有一些不一样的地方。

值得注意的点:我们一开始可以选择从0这个位置走,或者从1这个位置走,而且这两个开始的地方不收费,换句话说是往上爬楼梯时候收取的费用是现在所处的位置的价格,也就是上楼梯才收费,而且要注意我们要爬到顶端,是数组最后一个位置的下一个位置,而不是数组里包含元素-1。这一点很重要。

思路仍然是创建dp数组,dp[i]代表了达到这一层时候至少要多少钱,我们要求的是最小的花费。数组创建上创立一个数组数据个数+1这么大的空间,因为我们要求的是到楼顶的花费。数组初始化dp[0]=0dp[1]=0为什么这么写,上面也说过了,因为起始位置不花钱,往上走才花钱。

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()];}
};

代码也是很简短的,dp[i]采用比较从哪一阶梯上来花的钱比较少,就存储哪一个方案。最后返回的钱数就一定是最少的开销。

总结:

今天我们完成了斐波那契数、爬楼梯、使用最小花费爬楼梯三道题,相关的思想需要多复习回顾。接下来,我们继续进行算法练习。希望我的文章和讲解能对大家的学习提供一些帮助。

当然,本文仍有许多不足之处,欢迎各位小伙伴们随时私信交流、批评指正!我们下期见~

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue的动画与过度

一、Vue的动画效果 &#xff08;一&#xff09;编写CSS关键帧动画 keyframes show{from{transform: translateX(-100%);}to{transform: translateX(0px);} } &#xff08;二&#xff09;定义动画效果 .v-enter-active { animation: 配置项 } // 显示动画 .v-leave-active…

洛谷 P5717 三角形分类 C++代码

目录 前言 题目描述 思路点拨 优化 AC代码 AC截图 结尾 前言 马上就要突破10000浏览量了&#xff0c;再写一篇加加油&#xff01; 图片截图时间:2023.10.25.20:23 题目描述 网址&#xff1a;【深基3.习8】三角形分类 - 洛谷 思路点拨 这道题是给定三条边的长度&#…

一天收入500元的货拉拉运费差项目靠谱吗?

最近的货拉拉运费差项目有点火呀&#xff01;收费也不低&#xff0c;1680-16980的比比皆是。 这个项目去年我就在某些平台看到过&#xff0c;今天就跟大家详细聊聊这个项目&#xff0c;想入坑的不妨先看看这篇文章。 一&#xff1a;项目原理 有人叫它货拉拉搬砖项目&#xf…

骨传导耳机怎么佩戴,骨传导蓝牙耳机什么牌子好用

市面上的传统耳机一直以来都存在一些问题&#xff0c;比如长时间佩戴会导致耳朵不适&#xff0c;或者声音过大可能会伤害到耳膜。但是&#xff0c;现在有一种独特的耳机正在迅速走红&#xff0c;它被称为骨传导耳机&#xff0c;而骨传导耳机是怎么佩戴的呢&#xff0c;它在佩戴…

勒索病毒最新变种.locked勒索病毒来袭,如何恢复受感染的数据?

导言&#xff1a; 在当今数字化时代&#xff0c;网络威胁呈指数级增长&#xff0c;而.locked勒索病毒已经成为网络犯罪分子的犯罪工具之一。这种病毒以其高度破坏性和高级加密技术而著名&#xff0c;将用户的重要数据文件锁定&#xff0c;然后要求支付赎金以解锁这些文件。在本…

window安装es服务及删除

elasticsearch-service.bat install 删除es服务&#xff0c;先停止es服务运行&#xff0c;管理员cmd模式&#xff0c;sc delete "elasticsearch-service-x64"

gRPC初体验

一、gRPC简介 1、RPC是远程过程调用的简称&#xff0c;在分布式系统中&#xff0c;客户端可以像调用本地对象一样调用远程机器上服务端对象&#xff0c;用于系统的垂直拆分&#xff0c;常见的JAVA RPC框架有JAVA自带的RMI、基于Http的Hessian、阿里基于TCP的Dubbo、淘宝基于TC…

Kotlin中使用ViewBinding绑定控件并添加点击事件

文章目录 效果1、加入依赖2、与控件进行绑定在 Activity 中使用视图绑定 3、监听控件 效果 实现源码 class MainActivity : AppCompatActivity() {lateinit var binding:ActivityMainBindingoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstan…

云安全—K8s APi Server 6443 攻击面

0x00 前言 在未授权的一文中&#xff0c;详细描述了k8s api中的8080端口未授权的问题&#xff0c;那么本篇主要来说6443端口的利用。 0x01 API连接攻击面 1.匿名用户访问 匿名开放方式&#xff1a;kubectl create clusterrolebinding cluster-system-anonymous --clusterro…

React Hooks 实战案例

文章目录 一、React Hooks 简介二、React Hooks 的基本用法1. 使用 useState 创建状态2. 使用 useEffect 添加副作用 三、React Hooks 的常见问题1. 循环引用问题2. 副作用问题 四、React Hooks 实战案例1. 使用 useReducer 和 Redux&#xff1a;2. 使用 useContext&#xff1a…

暴力递归转动态规划(十一)

题目1&#xff1a; 这篇帖子中有多道题&#xff0c;由浅入深。 arr是货币数组&#xff0c;其中的值都是正数。再给定一个正数aim。每个值都认为是一张货币&#xff0c;即便是值相同的货币也认为每一张都是不同的&#xff0c;返回组成aim的方法数。 例如&#xff1a;arr {1,1,1…

【不用开发板学习STM32】可设置电子时钟

• 实验环境 工程文件下载链接&#xff01;https://mp.weixin.qq.com/s?__bizMzU2OTc4ODA4OA&mid2247551559&idx1&sn721b9238bc58936ac41e6ad1b9988554&chksmfcfb1990cb8c9086490b11c05bc76c08da15c71caa38715a047c49d36f25a149920aee482f3e&token204641…

SAP SPAD新建打印纸张

SAP SPAD新建打印纸张 1.事务代码SPAD 2.完全管理&#xff0d;设备类型&#xff0d;页格式-显示(创建格式页) 3.按标准A4纸张为模板参考创建。同一个纸张纵向/横向各创建1次(创建格式页) 4.完全管理&#xff0d;设备类型&#xff0d;格式类型-显示(创建格式类型&#xff0…

10、SpringCloud -- 优化重复下单

目录 优化重复下单问题的产生&#xff1a;需求&#xff1a;思路&#xff1a;代码&#xff1a;测试&#xff1a; 优化重复下单 之前超卖、重复下单的解决方式 问题的产生&#xff1a; 比如这个秒杀活动没人去玩&#xff0c;只有一个人去参与秒杀&#xff0c;然后秒杀成功了&a…

vue+Fullcalendar

vueFullcalendar: vueFullcalendar项目代码https://gitee.com/Oyxgen404/vue--fullcalendar.git

【错误解决方案】ModuleNotFoundError: No module named ‘transformers‘

1. 错误提示 在python程序中&#xff0c;尝试导入一个名为transformers的模块&#xff0c;但Python提示找不到这个模块。 错误提示&#xff1a;ModuleNotFoundError: No module named ‘transformers‘ 2. 解决方案 所遇到的问题是Python无法找到名为transformers的模块&am…

Angular-04:指令

① 内置指令1.1 *ngIf 结构指令1.2 [hidden] 属性指令1.3. *ngFor 结构指令1.4 *ngSwitch 结构指令 ② 自定义指令用法 指令是angular操作dom的途径&#xff0c;分为属性指令和结构指令。属性指令&#xff1a;修改元素的外观或行为。使用 [ ] 包裹。结构指令&#xff1a;增加、…

goctl 安装步骤

goctl&#xff1a;go-zero框架强大的项目脚手架工具&#xff0c;一个简单易用的代码生成工具。 go-zero官网&#xff1a;https://go-zero.dev/ go-zero 官网上面对 goctl 的介绍&#xff1a;goctl读作go control&#xff0c;不要读成go C-T-L。goctl的意思是不要被代码控制&a…

jenkins、ant、selenium、testng搭建自动化测试框架

如果在你的理解中自动化测试就是在eclipse里面讲webdriver的包引入&#xff0c;然后写一些测试脚本&#xff0c;这就是你所说的自动化测试&#xff0c;其实这个还不能算是真正的自动化测试&#xff0c;你见过每次需要运行的时候还需要打开eclipse然后去选择运行文件吗&#xff…

力扣:144. 二叉树的前序遍历(Python3)

题目&#xff1a; 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 示例&#xff1a; 示例 1&#xff1a; 输…