【动态规划算法】-第一题:1137.第N个斐波那契数

news2024/12/23 22:11:29

💖作者:小树苗渴望变成参天大树
🎉作者宣言:认真写好每一篇博客
🎊作者gitee:gitee
在这里插入图片描述
如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧!

文章目录

  • 前言


前言

各位友友们,大概又快一个月没有更新新的文章了,前段时间再准备学校的期末考试,所以耽误了更文的速度,暑假我会一直持续的更新好的文章,从这篇开始我就开始更新关于动态规划算法的博客,一题一篇,让大家可以更好的学习的每一个题目,之前的C++和Linux也会同步更新,大家可以通过作者的专栏来进行模块化学习,话不多说,我们开始进入正文


我们先来看看第一题,这是一个比较简单的题目,也是最能体现我们动态规划解题思路的一个题目,我将通过这个题目给大家入门动态规划。
1137.第N个斐波那契数
在这里插入图片描述
这个题目我们先将它的表达式换成我们常见的
在这里插入图片描述

那什么是动态规划?

毕竟是第一次接触这个东西,博主先用感性的话术给大家讲解一下,理性的去讲,大家可能都听不懂,使用动态规划需要五个步骤

  1. 状态表示
    是什么:就是又一个和数组一样的dp表,dp表里面的数据就表示一个状态,其实就是和数组一样
    怎么来:
    (1)题目要求(上面的题目就可以根据题目要求要求来将状态表示写出来,dp[n]就是第n个泰波那契数
    (2)经验(要多刷题)+题目要求(可以解决80%左右的题目)
    (3)分析题目要求,发现重复子问题

  2. 状态转移方程
    就是状态之间的关系方程,此题的状态转移方程就是这个
    在这里插入图片描述

  3. 初始化
    保证数组不越界,此题,我们只能从下标为3的开始进行往后面开始进行算,不然就会出现dp[-3],dp[-2],dp[-1],会越界

  4. 填表顺序
    为了填写的当前的状态的时候,所需的状态已经计算过了,此题,非常的贴心,我们要的就是前三个泰波那契数T0=0,T1=T2=1,按照顺序进行填写就可以了

  5. 返回值
    根据题目要求来确定返回值,此题,我们已经分析的状态表示里面的内容就是我们想要的返回值,所以返回值就是dp[n]

代码实现:

class Solution {
public:
    int tribonacci(int n) {
        int i=0;
        if(n==0)return 0;
        if(n==1||n==2)return 1;
        int* dp=new int[n+1];//创建一个dp表
        dp[0]=0;dp[1]=dp[2]=1;//填表顺序
        for(int i=3;i<=n;i++)//初始化
        {
              dp[i]=dp[i-3]+dp[i-2]+dp[i-1];//状态转移方程  
        }
        return dp[n];//返回值
    }
};

动态规划的题目主要在前面的分析,代码很容易实现的,这个代码的时间复杂度O(n)和空间复杂度O(n).

动态规划还有一个点,就是空间优化,后面的题目大约又三四十道题目都不会又空间优化,毕竟是第一题入门,要把动态规划涉及的知识点都要讲解清楚,我们动态规划是创建一个数组,既然是数组空间复杂度就大概可能是O(n),我们怎么解决这个问题呢??使用滚动数组,我们来看图解:
在这里插入图片描述
我们发现求第五个泰波那契数和第一个泰波那契数没有关系,依次类推。用动态规划的话术说,就是求后面的状态和前面的状态的没有关系,就可以使用滚动数组来进行空间优化
滚动数组的代码优化:

class Solution {
public:
    int tribonacci(int n) {
        int i=0;
        if(n==0)return 0;
        if(n==1||n==2)return 1;
       int a=0;int b=1,c=1;int d=0;
        for(int i=3;i<=n;i++)//初始化
        {
             d=a+b+c;
             a=b;b=c;c=d;
             //d=c;c=b;b=a;//这样是错误的
        }
        return d;//返回值
    }
};

运行结果:
在这里插入图片描述

到这里我们动态规划的第一题就讲解道这里,后面的每一题,我都将会通过这个方法来给大家讲解动态规划的五个步骤,让大家更好的理解动态规划,那我们下篇在见
在这里插入图片描述

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

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

相关文章

element之el-table合并列功能

目标效果如下&#xff1a; 实现代码如下&#xff1a; html部分&#xff1a; <!--定义表格组件,用组件自带的span-method属性定义合并列的方法--> <el-table :data"tableData" :span-method"spanRow"><el-table-column prop"RegionNa…

在proteus中仿真arduino驱动点阵屏matrix-led

我们都知道&#xff0c;如果我们仅仅在某个时间段点亮一个数码管是没有任何困难的&#xff0c;但如果我们点亮多个数码管就会出现问题&#xff0c;因为多个数码管都使用着同样的端口来控制数码管的各个段的亮灭。所以&#xff0c;就会用上一个很重要的方法&#xff0c;对&#…

使用javaScript脚本生成openFoam网格

简介 OpenFoam的首选网格生成器是blockMesh。blockMesh可以根据blockMeshDict这个字典中的信息生成openFoam网格。但是有时候需要修改网格&#xff0c;而网格中的几何点之间又存在约束关系&#xff0c;如果手动修改blockMeshDict那么工作量将是巨大的&#xff0c;所以有必要使…

有没有免费提取音频的软件,分享几个给大家!

在日常生活中&#xff0c;我们经常遇到需要从视频中提取音频的情况&#xff0c;无论是为了制作音频片段、录制语音笔记还是进行后期编辑。本文将介绍三种免费提取音频的方法&#xff0c;分别是记灵在线工具、PR&#xff08;Adobe Premiere Pro&#xff09;和剪映。通过这些方法…

【Vue3】学习笔记-自定义hook函数

概念 什么是hook? 本质是一个函数&#xff0c;把setup函数中使用的Composition API进行了封装。 类似于vue2.x中的mixin。(但是mixins会组件的配置项覆盖。vue3使用了自定义hooks替代mixnins&#xff0c;hooks本质上是函数&#xff0c;引入调用。) 自定义hook的优势: 复用代…

PPU (power policy unit)

写在前边 最近在做低功耗验证&#xff0c;项目中涉及到PPU这一块儿&#xff0c;在家查了好久资料&#xff0c;发现能找到的有价值的文章真的好少&#xff0c;机缘巧合之下&#xff0c;让我找到下边总结&#xff0c;分享出来&#xff0c;希望对和我有相同境遇的小伙伴带来帮助&a…

每周学点数学 2:概率论基础1

泊松分布、正态分布、二项分布 文章目录 1.概率论学习中的重难点2.主要工具介绍1. Python2. MATLAB3. R4. Octave5. Microsoft Excel6. 统计软件 3.理论内容概览&#xff08;前两点&#xff09;1. 概率2. 概率分布 注&#xff1a;本文适用于在在数学建模的应用中&#xff0c;回…

牛客网基础语法101~110题

牛客网基础语法101~110题&#x1f618;&#x1f618;&#x1f618; &#x1f4ab;前言&#xff1a;今天是咱们第十期刷牛客网上的题目。 &#x1f4ab;目标&#xff1a;对打印图案做到有手就行。 &#x1f4ab;鸡汤&#xff1a;与其花时间应付以后不理想的生活&#xff0c;不如…

学习c++ Part02

学习c Part02 前言1.函数注意点&#xff1a;全局函数&#xff08;默认函数&#xff09;静态函数 2.预处理2.1 变量 3.头文件4.宏函数5.指针5.1 普通变量与指针变量建立关系&#xff1a;5.2 指针初始化5.3 指针变量的注意事项5.3.1 void 不能定义普通变量,void * 可以定义指针变…

SpringBoot源码解析

1.Spring Boot介绍,源码阅读环境搭建,插件安装 2.spring boot 源码解析2-SpringApplication初始化 3.spring boot 源码解析3-SpringApplication#run 4.spring boot 源码解析4-SpringApplication#run第4步 5.spring boot 源码解析5-SpringApplication#run第5步 6.spring boot 源…

springboot医院挂号小程序

医院挂号系统 springboot医院挂号系统小程序 java医院挂号小程序 技术&#xff1a; 基于springbootvue小程序医院挂号系统的设计与实现 运行环境&#xff1a; JAVA版本&#xff1a;JDK1.8 IDE类型&#xff1a;IDEA、Eclipse都可运行 数据库类型&#xff1a;MySql&#xff08;…

在线教育场景下客户端实践与优化——RTC服务在线教育

在线教育场景下对提供稳定、高质量的音视频服务提出了非常高的要求。而不断推陈出新的课堂形式以及新技术的应用&#xff0c;使得好未来自研音视频SDK面临更多的挑战。 LiveVideoStackCon 2022北京站邀请到好未来音视频开发高级专家郭晓明介绍好未来自研SDK在工程化上所做出的努…

【编译、链接、装载十五】系统调用与API——printf源码分析

【编译、链接、装载十五】系统调用与API——printf源码分析 一、系统调用介绍1、什么是系统调用2、Linux系统调用3、系统调用的弊端 二、系统调用原理1、中断 三、linux下系统调用实现1、 strace 查看可知&#xff0c;printf调用了系统函数write2、gdb调试查看——printf3、gdb…

实践|随机森林中缺失值的处理方法

动动发财的小手&#xff0c;点个赞吧&#xff01; 除了在网上找到的一些过度清理的数据集之外&#xff0c;缺失值无处不在。事实上&#xff0c;数据集越复杂、越大&#xff0c;出现缺失值的可能性就越大。缺失值是统计研究的一个令人着迷的领域&#xff0c;但在实践中它们往往很…

并查集的讲解

什么是并查集&#xff1f; --是一个森林&#xff1b;&#xff08;由多颗树构成的&#xff09; 并查集原理 在一些应用问题中&#xff0c;需要 将 n 个不同的元素划分成一些不相交的集合 。 开始时&#xff0c;每个元素自成一个 单元素集合&#xff0c;然后按一定的规律将归于…

springboot开启热部署

第一步引入spring-boot-devtools依赖 <!--热部署--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><!--默认false改依赖是否可以传递&…

【Servlet】如何使用 Servlet 编写第一个 helloword 程序

文章目录 前言一、创建 Maven 项目二、引入依赖三、创建目录四、编写代码五、打包项目六、部署程序七、运行程序总结 前言 各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你: &#x1f4d5; JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习…

transforms数据增强

在AI领域的模型训练中通常会遇到模型过拟合问题&#xff0c;通常采取的办法就是数据增强处理&#xff0c;例如在图像处理中&#xff0c;数据增强是指对原始图像进行旋转、缩放、剪切、翻转等操作&#xff0c;以扩大训练数据集的规模&#xff0c;提高模型泛化能力&#xff0c;降…

Gradio HTML组件详解

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

【23-07-03:HTTP协议的结构学习】

目录 HTTP 请求的结构HTTP 请求的整体架构请求方法&#xff08;Method&#xff09;请求路径&#xff08;URI&#xff09;GET 参数&#xff08;Parameters for GET)协议说明&#xff08;Protocol&#xff09;头部字段&#xff08;Headers&#xff09;请求体&#xff08;Body&…