当前位置: 首页 > news >正文

【算法篇】逐步理解动态规划1(斐波那契数列模型)

目录

斐波那契数列模型  

1. 第N个泰波那契数

 2.使用最小花费爬楼梯

3.解码方法 


         学过算法的应该知道,动态规划一直都是一个非常难的模块,无论是状态转移方程的定义还是dp表的填表,都非常难找到思路。在这个算法的支线专题中我会结合很多力扣题型,由简单到复杂,带大家深度剖析动态规划类的题型,欢迎大家关注啊。

顺序:

题目链接-》算法思路-》代码呈现

斐波那契数列模型  

动态规划类题目解题步骤:

  1. 依据题目进行状态表示(dp[i]的含义)
  2. 写出状态转移方程(类似于dp[i]=dp[i-1]+dp[i-2])
  3. 为防止填表时数组越界,对dp表进行初始化(dp[0]=dp[1]=1)
  4. 搞清楚填表顺序(从前往后或者从后往前)
  5. 利用dp表返回问题答案

1. 第N个泰波那契数

题目链接:

https://leetcode.cn/problems/n-th-tribonacci-number/description/

算法思路:

1. 状态表⽰:
这道题可以「根据题⽬的要求」直接定义出状态表⽰:
dp[i] 表⽰:第 i 个泰波那契数的值。
2. 状态转移⽅程:
题⽬已经⾮常贴⼼的告诉我们了:
dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3]
3. 初始化:
从我们的递推公式可以看出, dp[i] i = 0 以及 i = 1 的时候是没有办法进⾏推导的,因为 dp[-2] dp[-1] 不是⼀个有效的数据。因此我们需要在填表之前,将 0, 1, 2 位置的值初始化。题⽬中已经告诉我们 dp[0] = 0,dp[1] = dp[2] = 1 。
4. 填表顺序:
毫⽆疑问是「从左往右」。
5. 返回值:
应该返回 dp[n] 的值。

代码呈现:

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

 2.使用最小花费爬楼梯

题目链接:

https://leetcode.cn/problems/min-cost-climbing-stairs/description/

算法思路:

1. 状态表⽰:
这道题可以根据「经验 + 题⽬要求」直接定义出状态表⽰:
dp[i] 表⽰:到达 i 位置时的最⼩花费。(注意:到达 i 位置的时候, i 位置的钱不需要算上)
2. 状态转移⽅程:
根据最近的⼀步,分情况讨论:
  • 先到达 i - 1 的位置,然后⽀付 cost[i - 1] ,接下来⾛⼀步⾛到 i 位置: dp[i - 1] + csot[i - 1]
  • 先到达 i - 2 的位置,然后⽀付 cost[i - 2] ,接下来⾛⼀步⾛到 i 位置: dp[i - 2] + csot[i - 2]
3. 初始化:
从我们的递推公式可以看出,我们需要先初始化 i = 0 ,以及 i = 1 位置的值。容易得到dp[0] = dp[1] = 0 ,因为不需要任何花费,就可以直接站在第 0 层和第 1 层上。
4. 填表顺序:
根据「状态转移⽅程」可得,遍历的顺序是「从左往右」。
5. 返回值:
根据「状态表⽰以及题⽬要求」,需要返回 dp[n] 位置的值。

代码呈现:

class Solution {public int minCostClimbingStairs(int[] cost) {int size=cost.length;if(size==2) return Math.min(cost[0],cost[1]);int[] dp=new int[size+1];dp[0]=0;dp[1]=0;dp[2]=Math.min(cost[0],cost[1]);for(int i=3;i<=size;i++){dp[i]=Math.min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);}return dp[size];}
}

3.解码方法 

题目链接:

https://leetcode.cn/problems/decode-ways/

 算法思路:

类似于斐波那契数列
1. 状态表⽰:
根据以往的经验,对于⼤多数线性 dp ,我们经验上都是「以某个位置结束或者开始」做⽂章,这
⾥我们继续尝试「⽤ i 位置为结尾」结合「题⽬要求」来定义状态表⽰。
dp[i] 表⽰:字符串中 [0 i] 区间上,⼀共有多少种编码⽅法。
2. 状态转移⽅程:
定义好状态表⽰,我们就可以分析 i 位置的 dp 值,如何由「前⾯」或者「后⾯」的信息推导出
来。
关于 i 位置的编码状况,我们可以分为下⾯两种情况:
i. i 位置上的数单独解码成⼀个字⺟;
ii. i 位置上的数与 i - 1 位置上的数结合,解码成⼀个字⺟。
下⾯我们就上⾯的两种解码情况,继续分析:
  • i 位置上的数与 i - 1 位置上的数结合在⼀起,解码成⼀个字⺟,也存在「解码成功」和「解码失败」两种情况:

i. 解码成功:当结合的数在 [10, 26] 之间的时候,说明 [i - 1, i] 两个位置是可以解码成功的,那么此时 [0, i] 区间上的解码⽅法应该等于 [0, i - 2 ] 区间上的解码⽅法,原因同上。此时 dp[i] = dp[i - 2]

ii. 解码失败:当结合的数在 [0, 9] [27 , 99] 之间的时候,说明两个位置结合后解码失败(这⾥⼀定要注意 00 01 02 03 04 ...... 这⼏种情况),那么此时 [0, i] 间上的解码⽅法就不存在了,原因依旧同上。此时 dp[i] = 0

  • 让 i 位置上的数单独解码成⼀个字⺟,就存在「解码成功」和「解码失败」两种情况:

i. 解码成功:当 i 位置上的数在 [1, 9] 之间的时候,说明 i 位置上的数是可以单独解 码的,那么此时 [0, i] 区间上的解码⽅法应该等于 [0, i - 1] 区间上的解码⽅ 法。因为 [0, i - 1] 区间上的所有解码结果,后⾯填上⼀个 i 位置解码后的字⺟就 可以了。此时 dp[i] = dp[i - 1]

ii. 解码失败:当 i 位置上的数是 0 的时候,说明 i 位置上的数是不能单独解码的,那么此时 [0, i] 区间上不存在解码⽅法。因为 i 位置如果单独参与解码,但是解码失败了,那么前⾯做的努⼒就全部⽩费了。此时 dp[i] = 0

3. 初始化:
⽅法⼀(直接初始化):
由于可能要⽤到 i - 1 以及 i - 2 位置上的 dp 值,因此要先初始化「前两个位置」。
初始化 dp[0]
i. s[0] == '0' 时,没有编码⽅法,结果 dp[0] = 0
ii. s[0] != '0' 时,能编码成功, dp[0] = 1
初始化 dp[1]
i. s[1] [1 9] 之间时,能单独编码,此时 dp[1] += dp[0] (原因同上,
dp[1] 默认为 0
ii. s[0] s[1] 结合后的数在 [10, 26] 之间时,说明在前两个字符中,⼜有⼀种
编码⽅式,此时 dp[1] += 1
⽅法⼆(添加辅助位置初始化):
可以在最前⾯加上⼀个辅助结点,帮助我们初始化。使⽤这种技巧要注意两个点:
i. 辅助结点⾥⾯的值要保证后续填表是正确的;
ii. 下标的映射关系
4. 填表顺序:
毫⽆疑问是「从左往右」
5. 返回值:
应该返回 dp[n - 1] 的值,表⽰在 [0, n - 1] 区间上的编码⽅法。

代码呈现:

class Solution {public int numDecodings(String s) {char[] arr=s.toCharArray();int n=arr.length;int[] dp=new int[n+1];dp[0]=1;if(arr[0]=='0') dp[1]=0;else dp[1]=1;if(n==1){return dp[1];}for(int i=2;i<n+1;i++){if(arr[i-1]!='0'){dp[i]+=dp[i-1];}if(((arr[i-2]-'0')*10+(arr[i-1]-'0'))<=26&&((arr[i-2]-'0')*10+(arr[i-1]-'0'))>=10){dp[i]+=dp[i-2];}}return dp[n];}
}

相关文章:

【算法篇】逐步理解动态规划1(斐波那契数列模型)

目录 斐波那契数列模型 1. 第N个泰波那契数 2.使用最小花费爬楼梯 3.解码方法 学过算法的应该知道&#xff0c;动态规划一直都是一个非常难的模块&#xff0c;无论是状态转移方程的定义还是dp表的填表&#xff0c;都非常难找到思路。在这个算法的支线专题中我会结合很多力…...

软件测试 - postman高级使用

断言 概念&#xff1a;让程序代替人判断测试用例执行的结果是否符合预期的一个过程 特点&#xff1a; postman断言使用js编写&#xff0c;断言写在postman的tests中 tests脚本在发送请求之后执行&#xff0c;会把断言的结果最终在testresult中进行展示 常用的postman提供的…...

数据交换技术

目录 <线路交换> <报文交换> <分组交换> 1.数据报分组交换 2.虚电路分组交换 计算机网络是以数据交换为目的的技术&#xff0c;从交换技术的发展过程来看&#xff0c;主要经历了线 路交换、报文交换、分组交换的过程。 <线路交换> 线路交换又称为…...

FFmpeg-- mp4文件合成1:aac和h264封装(c++实现)

文章目录 流程api核心代码muxer.hmuxer.cppaac 和 h264 封装为视频流,封装为c++的Muxter类 流程 分配视频文件上下文 int Init(const char *url); 创建流,赋值给视频的音频流和视频流 int AddStream(AVCodecContext *codec_ctx); 写视频流的head int SendHeader(); 写视频流的…...

【嵌入式开发 Linux 常用命令系列 1.3 -- 统计目录下有多少个文件】

统计目录下有多少个文件 在 Linux 中&#xff0c;你可以使用 find 命令和 wc&#xff08;word count&#xff09;命令的组合来统计当前目录及其子目录下的文件数量。如果你只对当前目录&#xff08;不包括子目录&#xff09;中的文件数量感兴趣&#xff0c;可以使用 ls 和 wc …...

JMeter 如何并发执行 Python 脚本

要在JMeter中并发执行Python脚本&#xff0c;可以使用Jython脚本或通过调用外部Python脚本的方式实现。 使用Jython脚本并发执行Python脚本的步骤&#xff1a; 1、创建一个线程组&#xff1a;在JMeter界面中&#xff0c;右键点击测试计划&#xff0c;选择 “添加” -> “线…...

第十三届蓝桥杯省赛真题 Java B 组【原卷】

文章目录 发现宝藏【考生须知】试题 A: 星期计算试题 B: 山试题 C: 字符统计试题 D: 最少刷题数试题 E \mathrm{E} E : 求阶乘试题 F : \mathrm{F}: F: 最大子矩阵试题 G: 数组切分试题 H: 回忆迷宫试题 I: 红绿灯试题 J 拉箱子 发现宝藏 前些天发现了一个巨牛的人工智能学习…...

Excel 打开后提示:MicrosoftExcel无法计算某个公式。在打开的工作簿中有一个循环引用...

目录预览 一、问题描述二、原因分析三、解决方案四、参考链接 一、问题描述 MicrosoftExcel无法计算某个公式。在打开的工作簿中有一个循环引用&#xff0c;但无法列出导致循环的引I用。请尝试编辑上次输入的公式&#xff0c;或利用“撤消”命令删除该公式&#xff0c;如下图&…...

【自我提升】计算机领域相关证书

目录 计算机技术与软件专业资格&#xff08;水平&#xff09;考试证书&#xff08;软考&#xff09;Oracle认证Cisco认证微软认证红帽认证AWS认证 计算机技术与软件专业资格&#xff08;水平&#xff09;考试证书&#xff08;软考&#xff09; 计算机技术与软件专业技术资格&a…...

外包干了15天,技术退步明显。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;2019年我通过校招踏入了南京一家软件公司&#xff0c;开始了我的职业生涯。那时的我&#xff0c;满怀热血和憧憬&#xff0c;期待着在这个行业中闯出一片天地。然而&#xff0c;随着时间的推移&#xff0c;我发现自己逐渐陷入…...

人工智能(Educoder)-- 搜索技术 -- 启发式搜索

任务描述 本关任务&#xff1a;八数码问题是在一个33的棋盘上有1−8位数字随机分布&#xff0c;以及一个空格&#xff0c;与空格相连的棋子可以滑动到空格中&#xff0c;问题的解是通过空格滑动&#xff0c;使得棋盘转化为目标状态&#xff0c;如下图所示。 为了简化问题的输…...

计算平均分 javascript

养成好习惯&#xff1a;先写注释再写代码 基础版&#xff1a;直接写逻辑&#xff08;平均分总和/个数&#xff09; // 求平均分 var scores [60, 55, 80, 33, 75, 100]; // 求和,相除 var sum 0; var avg;for (var i 0; i < 6; i) {sum scores[i]; }avg sum / 6; con…...

Redis入门到实战-第三弹

Redis入门到实战 Redis数据类型官网地址Redis概述Redis数据类型介绍更新计划 Redis数据类型 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://redis.io/Redis概述 Redis是一个开源的&#xff08;采用BSD许可证&#…...

AnyGo for Mac最新激活版:位置模拟软件打破地域限制

AnyGo for Mac&#xff0c;一款专为Mac用户打造的位置模拟软件&#xff0c;让您能够轻松打破地域限制&#xff0c;畅享无限可能。 软件下载&#xff1a;AnyGo for Mac v7.0.0最新激活版 通过AnyGo&#xff0c;您可以随时随地模拟出任何地理位置&#xff0c;无论是国内热门景点还…...

【Mysql数据库基础07】DDL 数据定义语言

Data Definition Language 1 库的操作1.1 create 创建1.2 alter 修改1.3 drop 删除 2 表的操作2.1 表的创建2.2 表的修改2.2.1 修改表名2.2.2 修改列名2.2.3 修改列的类型和约束2.2.4 添加列2.2.5 删除列 2.3 表的删除2.4 表的复制 3 练习 1 库的操作 1.1 create 创建 create…...

数据库及中表的创建和管理

目录 创建数据库 使用数据库(使用,查看信息) 修改数据库(删除,修改)...

git笔记之撤销、回退、reset方面的笔记

git笔记之撤销、回退、reset方面的笔记 code review! 文章目录 git笔记之撤销、回退、reset方面的笔记1.git 已经commit了&#xff0c;还没push&#xff0c;如何撤销到初始状态git reset --soft HEAD~1git reset HEAD~1&#xff08;等同于 git reset --mixed HEAD~1&#xff0…...

【中间件】docker数据卷

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;中间件 ⛺️稳中求进&#xff0c;晒太阳 1.数据卷&#xff08;容器数据管理&#xff09; 修改nginx的html页面时&#xff0c;需要进入nginx内部。并且因为内部没有编辑器&#xff0c;修改…...

【3D reconstruction 学习笔记 第二部】

三维重建 3D reconstruction 4. 三维重建与极几何三角化&#xff08;线性解法&#xff09;三角化&#xff08;非线性解法&#xff09;多视图几何极几何极几何约束基础矩阵估计 5. 双目立体视觉重建6. 多视图重建7. SFM 系统设计8. SLAM系统设计 4. 三维重建与极几何 三角化&…...

【CSP试题回顾】202109-1-数组推导(优化)

CSP-202109-1-数组推导 解题代码 #include <iostream> #include <vector> #include <algorithm> using namespace std;long long n, sumMax,sumMin;int main() {cin >> n;vector<long long>arr(n);for (size_t i 0; i < n; i){cin >>…...

VLC for Unity:工业级高性能视频渲染替代方案

1. 这不是“又一个视频插件”——VLC for Unity 解决的是 Unity 视频管线里最顽固的硬伤 你有没有在 Unity 项目里&#xff0c;把一段 4K H.265 的监控流拖进 VideoPlayer 组件&#xff0c;结果帧率直接掉到 8 FPS&#xff0c;GPU 占用飙到 95%&#xff0c;而 CPU 却只用了 30%…...

QMCDecode:解锁你的QQ音乐收藏,让加密音频重获自由

QMCDecode&#xff1a;解锁你的QQ音乐收藏&#xff0c;让加密音频重获自由 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac&#xff0c;qmc0,qmc3转mp3, mflac,mflac0等转flac)&#xff0c;仅支持macOS&#xff0c;可自动识别到QQ音乐下载目录&#xff…...

告别割裂开发:用WebUI插件在UE5里无缝嵌入你的React/Vue应用(附完整交互蓝图)

告别割裂开发&#xff1a;用WebUI插件在UE5里无缝嵌入你的React/Vue应用&#xff08;附完整交互蓝图&#xff09;在数字孪生和企业级可视化项目中&#xff0c;前端团队往往已经用React或Vue构建了复杂的数据看板&#xff0c;而3D场景部分则由UE5团队负责。传统做法是将两者分开…...

大语言模型在嵌入式系统开发中的应用与挑战

1. 嵌入式系统开发与大语言模型的碰撞 在智能家居、工业自动化和物联网设备蓬勃发展的今天&#xff0c;嵌入式系统作为连接数字世界与物理世界的桥梁&#xff0c;其开发复杂度正呈指数级增长。传统嵌入式开发要求工程师同时具备三大核心能力&#xff1a;理解电子元件特性与电路…...

2026年学习Java还有前景吗?如何看待2026Java程序员就业难现状?

2026年Java的前景和就业情况&#xff0c;这是一个很现实的问题。我们直接来看核心。Java依然有前景&#xff0c;但“普通选手”的就业黄金期确实过去了&#xff0c;现在需要的是“高配选手”。所谓的“就业难”&#xff0c;本质不是Java不行了&#xff0c;而是行业对Java程序员…...

Unity Library文件夹不是缓存,而是项目运行时核心枢纽

1. Library文件夹不是“缓存”&#xff0c;而是Unity工程的“神经系统”在Unity项目里&#xff0c;只要有人提“工程太大”&#xff0c;十有八九会冒出一句&#xff1a;“删掉Library文件夹不就完了&#xff1f;”——这话我听过不下五十遍&#xff0c;从刚入行的实习生&#x…...

nnAudio:基于PyTorch的GPU音频处理革命 - 10分钟快速入门指南

nnAudio&#xff1a;基于PyTorch的GPU音频处理革命 - 10分钟快速入门指南 【免费下载链接】nnAudio Audio processing by using pytorch 1D convolution network 项目地址: https://gitcode.com/gh_mirrors/nn/nnAudio nnAudio是一款基于PyTorch 1D卷积神经网络的GPU音频…...

Keil uVision开发环境文件类型全解析

1. uVision支持的文件类型全解析作为一名嵌入式开发工程师&#xff0c;我使用Keil uVision IDE已有八年时间。今天想系统梳理一下这个开发环境支持的各种文件类型&#xff0c;特别是那些在实际项目中经常遇到但官方文档解释不够详细的格式。理解这些文件类型对于项目管理和问题…...

26年5月系分论文~写作思路深度拆解

Hello 我是方才&#xff0c;15人研发leader、5年团队管理&架构经验。文末&#xff0c;附26年10月最新软考备考资料备考交流群&#xff0c;群友可享受每月直播哟&#xff01;2605系分论文分析今天系分和架构均已考完&#xff0c;方才先预祝所有考生均能逢考必过&#xff01;…...

2026年降AI工具会不会被知网检测到深度解读:使用降AI工具算学术不端吗免费完整分析

2026年降AI工具会不会被知网检测到深度解读&#xff1a;使用降AI工具算学术不端吗免费完整分析 关于降AI工具被知网检测到解读&#xff0c;我整理了几个核心问题&#xff0c;逐一分析。 实战方案先给出来&#xff1a;应对AIGC检测最有效的是专业工具深层文本重构&#xff0c;…...