数据结构与算法——动态规划算法简析

 1.初步了解动态规划

由于本篇博客属于动态规划的初阶学习,所以大多都是简单的表示,更深层次的学术用语会在之后深度学习动态规划之后出现,本文主要是带各位了解一下动态规划的大致框架 

1.1状态表示

通常的我们会开辟一个dp数组来存储需要表示的数据,其中dp[i]代指我们需要表示的位置,那么dp[i]的数据状态就是题目给出的限制条件,比如泰波那契数列中的第i个值或者最小花费爬楼梯的第i个台阶

1.2状态转移方程

通常的我们表示dp[i]位置的数据需要一定的公式,这种公式就是状态转移方程,比如泰波那契数列的第i个数是第i-3,i-2,i-1三个数之和,那么dp[i] = dp[i-3]+dp[i-2]+dp[i-1]就是泰波那契数列的状态转移方程,总的来说状态转移方程就是我们表示某一个特定位置需要遵循的规律

1.3初始化

一般来说在dp表中的前几个位置都是题目给出的,需要初始化用来表示后面的数据,这里依旧使用泰波那契数列举例,泰波那契数列的一开始三个位置的值分别为0、1、1,我们要用这三个值迭代求出第i(i>=4)个位置的值,那么初始化就要初始化dp表的前三个位置 

1.4填表顺序

一般来说填表都是逐个填表,不能跳跃某个位置,比如已知泰波那契数列的前三个位置的值就可以在第四个位置填表,但是如果在第五个位置填表就会出错,并且需要注意防止填表时越界,需要对边界情况特殊处理 

1.5返回值 

通常题目都会给出要求返回某个位置的值,比如给定某个变量n,求出第n个位置的值即可,需要具体题目具体讨论 

2.实战代码练习 

2.1题目解析

题目来源: 1137.第N个泰波那契数——力扣

测试用例

题目来源:746.最小花费爬楼梯——力扣

最小花费爬楼梯——牛客

测试用例

2.2算法原理

第N个泰波那契数

泰波那契数:目标位置前三个位置的和等于目标位置的值,前三个数为0/1/1

1.创建dp表,第n个泰波那契数就是dp表的第n+1个值,但是下标还是n

2.初始化前三个值

3.使用状态转移方程求出第n个泰波那契数

第N个泰波那契数——优化版本 

当需要求第i个位置的值就只需要保存i-1/i-2/i-3这三个位置的值即可,那么其他位置就会浪费,所以这里我们使用动态数组进行优化,即

1.只创建三个变量a/b/c作为滚动数组,使用d来存储第i个泰波那契数

2.不断将三个变量向后移动直到求出第n个泰波那契数,返回d即可

最小花费爬楼梯

已知需要爬到楼顶,而楼顶代表的是数组末尾数字的下一个位置,即n+1个位置,所以创建一个dp表返回到dp[n]位置的最小花费即可

1.因为每次只能走两步,所以第i个位置的最小花费就是第i-1与第i-2两个位置的较小值,那么我们就得到了状态转移方程dp[i]=min(cost[i-1]+dp[i-1],cost[i-2]+dp[i-2])

2.最终填表完成后直接返回dp[n]就代表第n+1个位置的值也就是到楼顶的最小花费

2.3代码展示

 第N个泰波那契数

class Solution {
public:int tribonacci(int n) {//创建dp表vector<int> dp(n + 1);//初始化dp[0] = 0;dp[1] = dp[2] = 1;//处理边界情况if(n == 0){return 0;}if(n == 1 || n == 2){return 1;}//状态表示方程for(int i = 3;i <= n;i++){dp[i] = dp[i-1] + dp[i-2] + dp[i-3];}return dp[n];}
};

 第N个泰波那契数——优化版本

class Solution {
public:int tribonacci(int n) {int a = 0,b = 1, c = 1;int d = 0;if(n == 0){return 0;}if(n == 1 || n == 2){return 1;}//滚动数组for(int i = 3;i <= n;i++){d = a + b + c;a = b;b = c;c = d;}return d;}
};

 最小花费爬楼梯

class Solution {
public:int minCostClimbingStairs(vector<int>& cost) {int n = cost.size();//创建dp表vector<int> dp(n + 1);//初始化dp[0] = dp[1] = 0;//状态转换方程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];}
};

 

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

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

相关文章

C++ WebDriver扩展

概述 WebDriver协议基于HTTP&#xff0c;使用JSON进行数据传输&#xff0c;定义了client与driver之间的通信标准。无论client的实现语言&#xff08;如Java或C#&#xff09;&#xff0c;都能通过协议中的endpoints准确指示driver执行各种操作&#xff0c;覆盖了Selenium的所有功…

【C语言】预处理指令详解

目录 一、预定义符号 二、#define 定义常量 三、#define 定义宏 &#xff08;1&#xff09;宏定义的使用 &#xff08;2&#xff09;带副作用的宏参数 &#xff08;3&#xff09;宏替换的规则 &#xff08;4&#xff09;宏与函数对比 &#xff08;5&#xff09;#和## …

基于单片机的书库环境监测

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;采用DHT11湿度传感器检测湿度&#xff0c;DS18B20温度传感器检测温度&#xff0c; 采用滑动变阻器连接数模转换器模拟二氧化碳和氧气浓度检测&#xff0c;各项数值通过lc…

SQL第12课——联结表

三点&#xff1a;什么是联结&#xff1f;为什么使用联结&#xff1f;如何编写使用联结的select语句 12.1 联结 SQL最强大的功能之一就是能在数据查询的执行中联结&#xff08;join)表。联结是利用SQL的select能执行的最重要的操作。 在使用联结前&#xff0c;需要了解关系表…

免费高可用软件

高可用软件是指那些能够提供高可用性、高可靠性的软件&#xff0c;它们在各种应用场景下都能确保系统的稳定运行。以下是四款免费的高可用软件&#xff0c;它们在不同领域都表现出色&#xff0c;能够满足各种高可用性需求。 一、PanguHA PanguHA是一款专为Windows平台设计的双…

使用正则表达式删除文本的奇数行或者偶数行

用智谱清言和kimi搜出来的结果都没法在notepad生效&#xff0c;后面在overflow上找到的答案比较靠谱。 查找&#xff1a;^[^\n]*\n([^\n]*) 替换&#xff1a;\1 删除偶数行 查找&#xff1a;^([^\n]*)\n[^\n]* 替换&#xff1a;\1 代码解释 ^&#xff1a;这个符号代表字符…

RabbitMQ 集群

文章目录 集群搭建使用 Docker-Compose 镜像队列搭建步骤工作原理镜像策略主从同步 同步延迟 集群搭建 参考&#xff1a; docker中安装并启动rabbitMQ Docker中搭建RabbitMQ集群 使用 Docker-Compose 这里提供一个脚本来使用 docker-compose 完成RabbitMQ集群的配置及启动…

机器学习-树模型算法

机器学习-树模型算法 一、Bagging1.1 RF1.2 ET 二、Boosting2.1 GBDT2.2 XGB2.3 LGBM 仅个人笔记使用&#xff0c;感谢点赞关注 一、Bagging 1.1 RF 1.2 ET 二、Boosting 2.1 GBDT 2.2 XGB 2.3 LGBM LightGBM&#xff08;Light Gradient Boosting Machine) 基本算法原理…

基于单片机的烧水壶系统设计

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52RC单片机&#xff0c;采用四个按键&#xff0c;通过DS18B20检测温度&#xff0c;开机显示实时温度 第一个按键为切换功能按键&#xff0c;按下后&#xff0c;可以设置烧水温度的大小&…

五子棋双人对战项目(6)——对战模块(解读代码)

目录 一、约定前后端交互接口的参数 1、房间准备就绪 &#xff08;1&#xff09;配置 websocket 连接路径 &#xff08;2&#xff09;构造 游戏就绪 的 响应对象 2、“落子” 的请求和响应 &#xff08;1&#xff09;“落子” 请求对象 &#xff08;2&#xff09;“落子…

【Git】vscode链接github拉去镜像

1.拉取别人的项目到自己的仓库 2.回到自己的仓库拉取文件到vscode里面下载 使用vscode进入虚拟机 推送到自己的仓库上面 在 github 页面将修改的内容 PR 到 Tutorial 创建一个个人仓库 代码如下 cd demo git clone https://github.com/3154067760/Tutorial.git cd Tutorial/…

UGUI(三大现成UI控件)

Rawimage 可以是任意类型的图&#xff0c;所以这里的泛型就更宽泛&#xff0c;不止sprite 相比Image唯二的不同 uvrect有点像平铺 Text suddenly come to a Free island. best fit开启后会有范围选择 Image image 组件是挂在RectTransform的ui下的&#xff0c;换句话说&…

域名续签申请步骤

来此加密-申请3个月使用&#xff08;免费&#xff09; 附上链接&#x1f517; 免费申请SSL证书,支持泛域名和多域名: 来此加密. 使用推荐码注册:E69X5K4D, 立刻获得5个积分. 访问:https://letsencrypt.osfipin.com/jump/share?codeE69X5K4D 登陆网站 https://letsencrypt.…

浅谈新能源电动汽车充电站建设与运营模式分析

摘要&#xff1a;电动汽车是当前新能源汽车中重要的组成部分&#xff0c;具有广阔的发展前景&#xff0c;能够实现“以电代油”&#xff0c;与传统的燃油汽车相比&#xff0c;电动汽车在噪音及废气排放量方面相对较少&#xff0c;具有节能环保的显著特点。而电动汽车充电站则是…

强引用、软引用、弱引用、虚引用用法

强引用、软引用、弱引用、虚引用用法 强引用弱引用弱引用虚引用 强引用 强引用是指程序中在程序代码之中类似“Object obj new Object()”的引用关系&#xff0c;无论任何情况下&#xff0c;只要强引用关系还存在&#xff0c;垃圾回收器就不会回收掉被引用的对象。 强引用是我…

【黑马点评】使用RabbitMQ实现消息队列——3.使用Jmeter压力测试,导入批量token,测试异步秒杀下单

3 批量获取用户token&#xff0c;使用jmeter压力测试 3 批量获取用户token&#xff0c;使用jmeter压力测试3.1 需求3.2 实现3.2.1 环境配置3.2.2 修改登录接口UserController和实现类3.2.3 测试类 3.3 使用jmeter进行测试3.4 测试结果3.5 将用户登录逻辑修改回去 3 批量获取用户…

地图可视化的艺术:深入比较Mapbox、OpenLayers、Leaflet和Cesium,不同场景下应如何选择地图库

目录 地图可视化的艺术&#xff1a;深入比较Mapbox、OpenLayers、Leaflet和Cesium 一、总览 二、定制地图美学的先行者——Mapbox 1、主要功能特点 2、开源情况 3、市场与应用人群 4、安装与基础使用代码 三、开源GIS地图库的全能王——OpenLayers 1、主要功能特点 2…

rabbitmq消费者应答模式

1.应答模式 RabbitMQ 中的消息应答模式主要包括两种&#xff1a;自动应答&#xff08;Automatic Acknowledgement&#xff09;和手动应答&#xff08;Manual Acknowledgement&#xff09;。 自动应答&#xff1a; 不在乎消费者对消息处理是否成功&#xff0c;都会告诉队列删…

ComfyUI增强图像细节只需要一个节点(附工作流),SD1.5、SDXL、FLUX.1 全支持,简单好用!

今天给小伙伴们介绍一个非常简单&#xff0c;但又相当好使的一个插件。 功能很简单&#xff0c;就是增加或者减少图像的细节&#xff0c;节点也很简单&#xff0c;就一个节点&#xff0c;只需要嵌入我们的 ComfyUI 的基础工作流中就可以了&#xff0c;随插随用。 而且该插件不…

springboot mail:如何高效管理邮件服务?

springboot mail发邮件教程&#xff1f;怎么实现spring发信功能&#xff1f; SpringBoot Mail作为Spring Boot框架的一部分&#xff0c;提供了一种简单而强大的方式来集成和管理邮件服务。AokSend将探讨如何高效地使用SpringBoot Mail来管理邮件服务&#xff0c;确保邮件发送的…