【算法练习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.mfbz.cn/a/109732.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

探讨下前端测试的常见场景

前端测试 场景 这边指的测试是指白盒测试&#xff0c;用代码来测试代码。 测试有利于提升代码质量。 代码功能和需求一致。根据需求&#xff0c;写测试。测试通过了&#xff0c;则表明需求实现了。保证代码重构后&#xff0c;未改坏以前的功能。代码重构后&#xff0c;能通过…

[C++入门系列]——类和对象下篇

​作者主页 &#x1f4da;lovewold少个r博客主页 ⚠️本文重点&#xff1a;C类和对象下篇知识点讲解 &#x1f449;【C-C入门系列专栏】&#xff1a;博客文章专栏传送门 &#x1f604;每日一言&#xff1a;宁静是一片强大而治愈的神奇海洋&#xff01; 目录 前言 再谈构造函数…

解决方案|法大大电子合同加速互联网家装服务升级

随着互联网的快速发展以及政策的不断推动&#xff0c;家装行业“互联网”趋势也不断凸显。行业内很多企业已经开始在全链条业务中使用电子合同&#xff0c;基于电子合同合规化、无纸化、线上化、智能化的价值赋能&#xff0c;实现家装从需求沟通、家装设计、选材、装修施工、验…

【MySQL--->内外连接】

文章目录 [TOC](文章目录) 一、内连接二、左外连接三、右外连接 一、内连接 内连接就是将两个表连接进行笛卡尔积查询 显示SMITH的名字和部门名称 二、左外连接 左外连接就是以左面的表为主&#xff0c;即便是右边的表没有而左边表项中有的&#xff0c;依然显示 查询所有学…

jenkins详细安装教程

这里写目录标题 一、Jenkins安装与部署1-1、Jenkins的简介1-2、下载需要的软件1-2-1 jekins.war1-2-2 tomcat安装方式 1-3、使用11版本的jdk1-4、开启jenkins1-5、获取密码1-5 修改镜像(可改可不改) 二、卸载Jenkins 一、Jenkins安装与部署 1-1、Jenkins的简介 Jenkins是一个…

Linux 基础入门

Linux 简介 Linux 是一种自由和开放源码的类 UNIX 操作系统。 Linux 英文解释为 Linux is not Unix。 Linux 是在 1991 由林纳斯托瓦兹在赫尔辛基大学上学时创立的&#xff0c;主要受到 Minix 和 Unix 思想的启发。 Linux 内核最初只是由芬兰人林纳斯托瓦兹&#xff08;Linus T…

基于SSM的n省出口基地公共信息服务平台设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

Spring Cloud Gateway + Knife4j 4.3 实现微服务网关聚合接口文档

目录 前言Spring Cloud 整合 Knife4jpom.xmlapplication.ymlSwaggerConfig.java访问单服务接口文档 Spring Cloud Gateway 网关聚合pom.xmlapplication.yml访问网关聚合接口文档 接口测试登录认证获取登录用户信息 结语源码 前言 youlai-mall 开源微服务商城新版本基于 Spring…

评估在线不平衡学习的PAUC

评估在线不平衡学习的PAUC 原始论文《Prequential AUC: properties of the area under the ROC curve for data streams with concept drift》 由于正常的AUC需要计算整体数据集上&#xff0c;每个数据的预测置信度的排名。那么我们首先要求我们的在线学习算法在进行预测时也返…

node实战——后端koa结合jwt连接mysql实现权限登录(node后端就业储备知识)

文章目录 ⭐前言⭐ 环境准备⭐ 实现过程⭐ mysql 配置⭐路由前的准备⭐账号注册生成token⭐账号登录生成token⭐token登录 ⭐ 自测过程截图⭐总结⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享关于node实战——后端koa项目配置jwt实现登录注册&#xff08;n…

博客模板博客模板

xservices-bpm-6.2.1.1.jar 本人详解 作者&#xff1a;王文峰&#xff0c;参加过 CSDN 2020年度博客之星&#xff0c;《Java王大师王天师》作者 公众号&#xff1a;山峯草堂&#xff0c;非技术多篇文章&#xff0c;专注于天道酬勤的 Java 开发问题、中国国学、传统文化和代码爱…

智慧矿山AI算法助力护帮板支护监测,提升安全与效率

在智慧矿山AI算法系列中&#xff0c;护帮板支护监测是保障矿山安全和提高生产效率的重要环节。护帮板作为矿山支护体系中的重要组成部分&#xff0c;在矿山生产中起到了关键的作用。那么&#xff0c;护帮板在哪种状态下是正常打开的呢&#xff1f;本文将对此进行介绍。 护帮板的…

LeetCode热题100 240.搜索二维矩阵||

题目描述&#xff1a; 编写一个高效的算法来搜索 m*n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例1&#xff1a; 输入&#xff1a;matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,2…

「实验记录」CS144 Lab0 networking warmup

文章目录 一、Motivation二、SolutionsS1 - Writing webgetS2 - An in-memory reliable byte stream 三、Results四、Source 一、Motivation 第一个小测试 webget 是想让我们体验并模拟一下在浏览器中键入 URL 后获得远程服务器传来的内容&#xff0c;这并没有太大的难度&…

【IDEA】设置sql提示

第一步&#xff1a;注入SQL语言 1.首先选择任意一条sql语句&#xff0c;右击&#xff0c;选择 ‘显示上下文操作’ 2.选择 ‘注入语言或引用’ 3. 往下翻&#xff0c;找到MySQL 第二步&#xff1a;配置MySQL数据库连接 1.首先点击侧边的数据库&#xff0c;再点击上面的加号 2…

OpenCV官方教程中文版 —— Hough 圆环变换

OpenCV官方教程中文版 —— Hough 圆环变换 前言Hough 圆环变换 前言 目标 • 学习使用霍夫变换在图像中找圆形&#xff08;环&#xff09; • 学习函数&#xff1a;cv2.HoughCircles() Hough 圆环变换 opencv_logo.png&#xff1a; # -*- coding: utf-8 -*- import cv2 …

基于STC12C5A60S2系列1T 8051单片机可编程计数阵列CCP/PCA/PWM模块的PWM(脉冲宽度调制)应用

基于STC12C5A60S2系列1T 8051单片机可编程计数阵列CCP/PCA/PWM模块的PWM&#xff08;脉冲宽度调制&#xff09;应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍STC…

设备完全有效生产率TEEP对生产制造企业有什么作用?

设备完全有效生产率&#xff08;Total Effective Efficiency of Production&#xff0c;简称TEEP&#xff09;是反映企业设备效率的一项重要指标&#xff0c;用于评估生产制造企业的设备利用率和生产效率。本文将从三个方面探讨TEEP的含义、计算方法以及对生产制造企业的作用。…

回收废品抢派单小程序开源版开发

回收废品派单抢派单小程序开源版开发 在这个废品回收抢单派单小程序开源版开发中&#xff0c;我们将构建一个专业且富有趣味性的平台&#xff0c;以深度的模式来重塑废品回收体验。 我们将提供一个会员注册功能&#xff0c;用户可以通过小程序授权注册和手机号注册两种方式快…

Leetcode—2558.从数量最多的堆取走礼物【简单】

2023每日刷题&#xff08;十二&#xff09; Leetcode—2558.从数量最多的堆取走礼物 大顶堆实现代码 void swap(int *a, int *b) {int tmp *a;*a *b;*b tmp; }void downAdjustHeap(int *heap, int low, int high) {int i low;int j 2 * i 1;while(j < high) {if(j …
最新文章