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

news2024/11/25 23:02:07

在这里插入图片描述

​📝个人主页:@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.coloradmin.cn/o/1147108.html

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

相关文章

所有电商API接口,淘宝API接口分类,1688API、拼多多API、京东API

前往接入API 淘宝API item_get 获取商品详情 根据商品ID查询商品标题价格描述等详情数据 淘宝API item_search 按关键字搜索商品 搜索关键字&#xff0c;显示商品总数&#xff0c;标题&#xff0c;图片&#xff0c;优惠价等数据 淘宝API item_fee 获取商品快递费用 输入商品…

基于RK3568高性价比全国产EMS储能解决方案(一)概述

储能产业链框架 储能产业链可分为上游“原材料及生产设备”、中游“储能系统”、下游“储能场景应用及后市场服务”。 图1 储能产业链框架图 产业链中游的“储能电池系统”主要包括“能量管理系统(EMS)”、“电池管理系统(BMS)”、“储能逆变器(PCS)”、“电池组”四个部分。…

Java创建一个长度为10的数组,利用Arrays.sort(), 为数组元素排序

程序要求&#xff1a;1&#xff09;创建一个整型数组&#xff0c;数组的长度为10. 2&#xff09;给数组元素赋值&#xff0c;要求乱序。 3&#xff09;利用fori循环将数组元素依次输出。 4&#xff09;利用Arrays.sort(), 为数组元素排序 5&#xff09;采用增加for循环将排…

shell语法大全(超级详细!!!!),非常适合入门

本文旨在对y总的Linux基础课shell语法做学习记录&#xff0c;指令较多&#xff0c;方便日后查找。 参考视频&#xff1a;Linux基础课 参考教程&#xff1a;Linux教程 1 概论 Linux中常见的shell脚本有很多种&#xff0c;常见的有&#xff1a; Bourne Shell(/usr/bin/sh或/bi…

Evade Deep Image Retrieval by Stashing Private Images in the Hash Space

摘要&#xff1a; 挑战&#xff1a; 当网络上的图像被大规模检索并被用作个人信息的丰富矿藏时&#xff0c;隐私也面临着风险&#xff1b; 攻击者可以通过从目标类别中查询类似图像以查找任何可用模型来提取私有图像。 提出&#xff1a; 提出了一种基于对抗性示例的新机制…

Cesium绕点旋转

目录 项目地址实现效果实现方法 项目地址 https://github.com/zhengjie9510/webgis-demo 实现效果 实现方法 let angle 0.0 viewer.camera.lookAt(position, new Cesium.HeadingPitchRange(Cesium.Math.toRadians(angle), Cesium.Math.toRadians(-30), 2000)) viewer.clock…

Ubuntu自建git服务器

Ubuntu 安装 gitlab-ce sudo apt-get update sudo apt-get install gitlab-ce 安装成功 sudo apt-get install gitlab-ce 正在读取软件包列表... 完成 正在分析软件包的依赖关系树 正在读取状态信息... 完成 下列【新】软件包将被安装&#xff1a;gitlab-ce 升…

基于鸟群算法的无人机航迹规划-附代码

基于鸟群算法的无人机航迹规划 文章目录 基于鸟群算法的无人机航迹规划1.鸟群搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用鸟群算法来优化无人机航迹规划。 1.鸟群搜索算法 …

koa搭建服务器(二)

在上一篇文章已经成功的运行了一个http服务器&#xff0c;接下来就是使用Sequelize ORM&#xff08;官方文档&#xff1a;Sequelize 简介 | Sequelize中文文档 | Sequelize中文网&#xff09;来操作数据库。 1、安装依赖 首先也是需要安装相关的依赖 npm i sequelize npm i …

【Mysql】数据库三大范式

数据库三范式 &#xff1a;数据库三范式是指关系型数据库设计中的三种规范化设计原则&#xff0c;旨在减少数据冗余、提高数据一致性和可维护性。 第一范式&#xff1a;规定表中的每一列都应该是不可分割的最小单元。 为什么要这样实现呢&#xff1f; &#xff1a;举个栗子…

【Unity PlasticSCM】记录:从介绍 下载 到拉取项目

实习的时候项目是svn管理的&#xff0c;这次mini的项目管理最后选择了美术策划友好的plasticSCM&#xff0c;但之前没有接触过&#xff0c;所以决定花费一点时间去了解&#xff0c;然后记录一下中间遇到的一些问题。 了解及下载Plastic b站很详细介绍PlasticSCM&#xff1a;Un…

ChatGPT扩展系列之ChatExcel

文章目录 ChatGPT扩展系列之ChatExcel对某一列的文字进行处理对数据进行排序对数据进行计算微软官方又推出Excel AI插件ChatGPT扩展系列之ChatExcel 自从ChatGPT很空出世之后,很多基于ChatGPT的应用便如雨后春笋般应用而生,这些应用的底层本质就是利用了ChatGPT对自然语言的…

计网强化

文章目录 1.TCP报文段、IP分组、MAC帧(1)TCP报文段 首部字段①发送窗口、接收窗口、拥塞窗口、滑动窗口(2)IP数据报 首部格式①片偏移量(3)MAC帧2.转发表、路由表、ARP表3.网络三层设备(1)集线器、交换机、路由器(2)冲突域与广播域(3)广播(4)时延

高等数学教材重难点题型总结(七)微分方程

高数上册最后一章&#xff0c;虽然不如积分难&#xff0c;但也颇为恶心&#xff0c;好在套路很固定&#xff0c;重点在于&#xff1a;区分方程类型&#xff0c;记忆求解公式~ 此外&#xff0c;诸如伯努利、欧拉方程等内容&#xff0c;是考研数学一的内容&#xff0c;学校的期末…

AI:40-基于深度学习的森林火灾识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌本专栏包含以下学习方向: 机器学习、深度学…

3 ALS算法的优化

3.1引入时间遗忘曲线 3.2引入物品特征 3.3时间特征和物品特征加权融合 ALS优化算法的执行步骤 将式(12)对原始评分矩阵进行优化,再代入 式(3)得到了优化后的ALS算法。该算法步骤如下: 第一步:读取数据集,初始化用户-物品评分

Illustrator 2024(AI v28.0)

Illustrator 2024是一款功能强大的矢量图形编辑软件&#xff0c;由Adobe公司开发。它是设计师、艺术家和创意专业人士的首选工具&#xff0c;用于创建和编辑各种矢量图形、插图、图标、标志和艺术作品。 以下是Adobe Illustrator的主要功能和特点&#xff1a; 矢量图形编辑&…

Kotlin协程核心理解

一、协程是什么&#xff1f; 1.1 基本概念的理解 我们知道JVM中的线程的实现是依赖其运行的操作系统决定的&#xff0c;JVM只是在上层进行了API的封装&#xff0c;包含常见的有线程的启动方法&#xff0c;状态的管理&#xff0c;比如&#xff1a;Java中抽象出了6种状态&#x…

软件测试自学路线

一、简介 本文从一个简单的登录接口测试入手&#xff0c;一步步调整优化接口调用姿势&#xff0c;然后简单讨论了一下接口测试框架的要点&#xff0c;最后介绍了一下我们目前正在使用的接口测试框架pithy。期望读者可以通过本文对接口自动化测试有一个大致的了解。 二、引言 …

0038Java程序设计-基于java高校社团管理系统论

文章目录 **摘 要****目** **录**系统实现开发环境 摘 要 当前&#xff0c;大多数高校的社团信息管理都是采用纸质档案的方式来管理的&#xff0c;这样不仅不能长期的保存信息&#xff0c;而且在数据的查找上带来很大的不方便。在目前的网络技术和计算机技术的普及和信息管理的…