【动态规划精选题目】1、斐波那契数列模型

 

此动态规划系列主要讲解大约10个系列【后续持续更新】

本篇讲解入门级:斐波那契模型,会在讲解题目同时给出AC代码

为什么叫斐波那契数列模型?因为本篇4道题的状态转移方程都跟斐波那契递推方程差不多,但这点不重要,请往下看

目录

 1、泰波那契数

2、三步问题

3、使用最小花费爬楼梯

4、解码方法


 1、泰波那契数

  我们动态规划首先是填dp表,填满dp表后,里面的某个值就是我们要求的最终结果(本题很简单,状态转移方程都直接给你了)

class Solution {
public:int tribonacci(int n) {//1、创建dp数组//2、初始化//3、填表//4、返回值//处理一下边界情况,若不处理下面到转移方程那里会越界if (n == 0) return 0;if (n == 1 || n == 2) return 1;vector<int> dp(n + 1);//多开一个,因为我们会算到第n个数dp[0] = 0, dp[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];//返回第n个泰波那契数}
};

 空间优化:

 因为我们上述代码中空间复杂度O(N),利用滚动数组思想可以实现O(1)

注:这种滚动数组我们以后笔试不要求,但是面试时可能有点研究价值,所以对于这个东西不用过分研究,但是注意后面讲解背包问题时会使用这个思想

class Solution {
public:int tribonacci(int n) {//处理一下边界情况,防止下面填表直接越界了if (n == 0) return 0;if (n == 1 || n == 2) return 1;int a = 0, b = 1, c = 1, d = 0;for (int i = 3; i <= n; i++){d = a + b + c;//滚动操作a = b;b = c;c = d;}return d;}
};

2、三步问题

class Solution {
public:int waysToStep(int n) {//1、创建dp数组//2、初始化//3、填表//4、返回值const int MOD = 1e9 + 7;//处理边界条件if (n == 1 || n == 2) return n;if (n == 3) return 4;vector<int> dp(n + 1);dp[1] = 1, dp[2] = 2, dp[3] = 4;for (int i = 4; i <= n; i++){//结果取模,必须对每一次加法的结果都取一次模,不能全加完再取模dp[i] = ((dp[i - 1] + dp[i - 2]) % MOD + dp[i - 3]) % MOD;}return dp[n];}
};

3、使用最小花费爬楼梯

解法一: 

 

class Solution {
public:int minCostClimbingStairs(vector<int>& cost) {//1、创建dp表//2、初始化//3、填表//4、返回值int n = cost.size();vector<int> dp(n + 1);//你不传初始值的话vector默认把值初始化为0for (int i = 2; i <= n ; i++){//到第i个台阶的花费=min(到第i-2个台阶的最小花费后再跨两步的花费,//到第i-1个台阶的最小花费后再跨一步的花费)dp[i] = min(dp[i - 2] + cost[i - 2], dp[i - 1] + cost[i - 1]);}return dp[n];}
};

解法二:

 注:解法二不用多开一个位置,因为是把最后两个位置初始化后往前推,从而得出最终结果

class Solution {
public:int minCostClimbingStairs(vector<int>& cost) {int n = cost.size();vector<int> dp(n);//从n-2到终点一定是一下跨两步,故cost[n - 2]即可dp[n - 1] = cost[n - 1], dp[n - 2] = cost[n - 2];for (int i = n - 3; i >= 0; i--){dp[i] = cost[i] + min(dp[i + 1], dp[i + 2]);}return min(dp[0], dp[1]);}
};

 总结:

状态表示有很多种,但是状态表示是否对要看你能够写出状态转移方程求解出问题,动态规划的题目需要大量经验,经验足够后再写状态表示等就会很熟练了


4、解码方法

class Solution {
public:int numDecodings(string s) {int n = s.size();vector<int> dp(n);//初始化dp[0]dp[0] = s[0] != '0';//只要第一个字符不是'0',就可以单独编码if (n == 1) return dp[0];//初始化dp[1]if(s[0] != '0' && s[1] != '0') dp[1] += 1;//两数字可以单独编码的情况int con = (s[0] - '0') * 10 + s[1] - '0';//共同编码的结果在10~26就是成功的,因为0~9会有前导0,就失败了if (con >= 10 && con <= 26) dp[1] += 1;for (int i = 2; i < n; i++){//计算以i位置结尾的解码方案数if (s[i] != '0') dp[i] += dp[i - 1];int con = (s[i - 1] - '0') * 10 + s[i] - '0';if (con >= 10 && con <= 26) dp[i] += dp[i - 2];}return dp[n - 1];}
};

 优化:

 因为在计算以1位置结尾时的解放方案数与在计算从2位置往后的代码类似,所以我们可以做一个优化,让以1位置结尾的计算也在for循环中进行

class Solution {
public:int numDecodings(string s) {//优化int n = s.size();vector<int> dp(n + 1);dp[0] = 1;//保证后续填表正确dp[1] = s[1 - 1] != '0';for (int i = 2; i <= n; i++){//计算以i位置结尾的解码方案数if (s[i - 1] != '0') dp[i] += dp[i - 1];int con = (s[i - 2] - '0') * 10 + s[i - 1] - '0';if (con >= 10 && con <= 26) dp[i] += dp[i - 2];}return dp[n];}
};

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

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

相关文章

【C++】:set和map

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关多态的知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数据结…

补充回答一些关于枚举类型的问题

补充回答一些关于枚举类型的问题 1.枚举类型在什么时候使用 枚举类型在以下情况下特别有用&#xff1a; 有限的离散值集合&#xff1a; 当变量的取值只有有限且离散的几个选项时&#xff0c;使用枚举类型能够提高代码的可读性。例如&#xff0c;星期几、月份、颜色等。 enum W…

Uncaught ReferenceError: jQuery is not defined解决方法

当我在写java的Maven项目时&#xff0c;出现了这样的一个报错信息&#xff1a; 我一直找代码&#xff0c;抓包&#xff0c;调试&#xff0c;比对代码 jQuery未定义就是指JS的导包没有导进来&#xff01;&#xff01;&#xff01;&#xff01; 导进来就运行正常啦

Server check fail, please check server xxx.xxx.xxx.xxx,port 9848 is available

记录一次服务调用中的错误 背景&#xff1a;我使用了nacos2.x的版本&#xff0c;同时在同一台服务器的三个docker容器中部署了nacos1、2、3&#xff0c;并将它们连接到了同一个docker网络 错误&#xff1a;Server check fail, please check server xxx.xxx.xxx.xxx,port 9848 …

使用cmake构建Qt6.6的qt quick项目,添加应用程序图标的方法

最近&#xff0c;在学习qt的过程中&#xff0c;遇到了一个难题&#xff0c;不知道如何给应用程序添加图标&#xff0c;按照网上的方法也没有成功&#xff0c;后来终于自己摸索出了一个方法。 1、准备一张图片作为图标&#xff0c;保存到工程目录下面&#xff0c;如logo.ico。 …

主机访问Android模拟器网络服务方法

0x00 背景 因为公司的一个手机app的开发需求&#xff0c;要尝试链接手机开启的web服务。于是在Android Studio的Android模拟器上尝试连接&#xff0c;发现谷歌给模拟器做了网络限制&#xff0c;不能直接连接。当然这个限制似乎从很久以前就存在了。一直没有注意到。 0x01 And…

Python编程技巧 – 使用组合运算符

Python编程技巧 – 使用组合运算符 Python Programming Skills – Using Combined Operators Python通过赋值过程&#xff0c;将声明变量与赋值和而为之&#xff0c;可谓讲求效率。此外&#xff0c;在Python赋值运算符里&#xff0c;也有一个强大高效的功能&#xff0c;即复合…

赴美上市传闻再起,SHEIN走到十字路口

作者 | 辰纹 来源 | 洞见新研社 裹挟着“黑五”大胜的余波&#xff0c;跨境电商巨头SHEIN&#xff08;希音&#xff09;将赴美IPO的传闻又在行业中散播开来。 金融投资报称SHEIN此次IPO的估值或达900亿美元&#xff1b;上海证券报表示&#xff0c;SHEIN已对投资人发出了路演…

字符设备驱动开发基础

一. 简介 本文简单了解一下&#xff0c;在字符设备驱动开发开始前对其一些基本认识。简单了解一下&#xff0c;应用程序与驱动的交互原理&#xff0c;以及字符设备驱动开发流程。 二. 字符设备驱动开发流程 1. 在 Linux 中一切皆为文件&#xff0c;驱动加载成功以后会在“…

Camunda 7.x 系列【60】流程分类

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 2.7.9 本系列Camunda 版本 7.19.0 源码地址:https://gitee.com/pearl-organization/camunda-study-demo 文章目录 1. 前言2. 案例演示2.1 后端2.2 前端2.3 测试1. 前言 钉钉中的OA审批分类: 企业级的业务…

vue2 echarts饼状图,柱状图,折线图,简单封装以及使用

vue2 echarts饼状图&#xff0c;柱状图&#xff0c;折线图&#xff0c;简单封装以及使用 1. 直接上代码&#xff08;复制可直接用&#xff0c;请根据自己的文件修改引用地址&#xff0c;图表只是简单封装&#xff0c;可根据自身功能&#xff0c;进行进一步配置。&#xff09; …

优雅玩转实验室服务器(二)传输文件

使用服务器最重要的肯定是传输文件了&#xff0c;我们不仅需要本地的一些资源上传到服务器&#xff0c;好进行实验&#xff0c;也需要将服务器计算得到的实验结果传输到本地&#xff0c;来进行预览或者报告撰写。 首先&#xff0c;由于涉及到服务器操作&#xff0c;我强烈推荐…

Jemeter,提取响应体中的数据:正则表达式、Json提取器

一、正则表达式 1、线程组--创建线程组&#xff1b; 2、线程组--添加--取样器--HTTP请求&#xff1b; 3、Http请求--添加--后置处理器--正则表达式提取器&#xff1b; 4、线程组--添加--监听器--查看结果树&#xff1b; 5、线程组--添加--取样器--调试取样器。 响应体数据…

UI5 development on VS Studio code

今天来分享一下如何VS studio code 上UI5开发环境的搭建 1.安装Node.js 路径&#xff1a;Node.js 因安装步骤较为简单&#xff0c;故不在此赘述。 验证方法如下&#xff1a;WINR-->CMD--->node --version 出现下图即可 2. 安装UI5 CLI (为了后面我们方便使用UI5 的命令…

本地部署语音转文字(whisper,SpeechRecognition)

本地部署语音转文字 1.whisper1.首先安装Chocolatey2.安装3.使用 2.SpeechRecognition1.环境2.中文包3.格式转化4.运行 3.效果 1.whisper 1.首先安装Chocolatey https://github.com/openai/whisper 以管理员身份运行PowerShell Set-ExecutionPolicy Bypass -Scope Process -…

【JVM从入门到实战】(一) 字节码文件

一、什么是JVM JVM 全称是 Java Virtual Machine&#xff0c;中文译名 Java虚拟机。 JVM 本质上是一个运行在计算机上的程序&#xff0c;他的职责是运行Java字节码文件。 二、JVM的功能 解释和运行 对字节码文件中的指令&#xff0c;实时的解释成机器码&#xff0c;让计算机…

ubuntu20 安装docker

一.官网安装文档 &#xff08;基本按官方文档安装&#xff09; Install Docker Engine on Ubuntu | Docker Docs 二.安装步骤 1.docker 需要64位操作系统、linux内核要在3.1以上 #uname -r 2.卸载可能存在的旧版本 #sudo apt-get remove docker docker-engine docker-ce …

Redis rdb源码解析

前置学习&#xff1a;Redis server启动源码-CSDN博客 1、触发时机 1、执行save命令--->rdbSave函数 2、执行bgsave命令--->rdbSaveBackground函数或者&#xff08;serverCron->prepareForShutdown&#xff09; 3&#xff0c;主从复制-->startBgsaveForReplication…

图文教程:stable-diffusion的基本使用教程 txt2img(多图)

之前我介绍了SD的安装过程&#xff0c;那么这篇将介绍怎么使用SD 使用模型 SD安装好之后&#xff0c;我们只有一个默认的模型。这个模型很难满足我们的绘图需求&#xff0c;那么有2种方法。 1是自己训练一个模型&#xff08;有门槛&#xff09;2是去网站上找一个别人练好的模…

分布式ID服务实践

背景 分布式场景下需要一个全局 ID 来标识唯一性&#xff0c;比如在单数据库时通过表唯一主键即可实现唯一 ID&#xff0c;分库分表时就需要全局唯一 ID。 业务对唯一 ID 的要求如下&#xff1a; 全局唯一性 不能出现重复的 ID 号&#xff0c;既然是唯一标识&#xff0c;这…