【动态规划】第N个泰波那契数

news2024/11/15 20:50:57

📭从这里开始,我们要开始学习动态规划辣。之后的动态规划有关的文章都是按照这个逻辑来写,首先来介绍一下基本逻辑。

🧀(1)题目解析:就是分析题目,读懂题目想让我们实现的功能

🧀(2)算法原理:也是最最关键的一点,是我们用动态规划解题的分析过程,也是我们分析问题的具体思路,具体可以分为

🥑[1]状态表示

一般会创建一个数组(dp表),表中的某个位置的值表示的含义就是状态表示。(感性认知)

怎么确定题目中的状态表示?一般分为三种(之后更新的动态规划相关文章,基本上就是这三种方法确定状态表示)

🙈1*题目要求 

🙉2*经验+要求  以i位置结尾,......(根据题目要求进行描述)

🙊3*分析问题过程中发现重复子问题

🥑[2]状态转移方程 

根据题目推导出有关方程表示 dp[i]

🥑[3]初始化 

为了保证dp表中元素不越界,开始时的几个元素要进行初始化

🥑[4]填表顺序 

在填写当前状态时,所需状态已经填写过了。(一般分为从左向右or从右向左)

🥑[5]返回值

最后返回所需值dp[n]

🧀(3)代码实现

根据上述算法思想,注意一下细节问题,然后写出对应代码。

🧀(4)空间优化 

 一般用滚动数组的方式实现。

在最后用dp表写好具体代码之后,计算出时间和空间复杂度,可以尽可能地优化,减少复杂。但是一般没有这种要求,因此可以适当分析一下,并不是必须的。

🧁题目描述:

示例描述:

 🧀(1)题目解析

泰波那契数列和之前我们熟知的斐波拉契数列比较类似,但是却略有不同。根据题目描述,泰波那契数列是指第n个数是由前三个数的和组成的一个数列

🧀(2)算法原理:

🥑[1]状态表示

dp[i]表示:以第i个元素结尾,泰波那契数的值

🥑[2]状态转移方程 

根据题目,可以很容易推出T[n]=T[n-3]+T[n-2]+T[n-1],即状态转移方程

🥑[3]初始化 

因为前三个泰波那契数由题目给出,是无法推出的。因此他们要给初始值:dp[0]=0; dp[1]=dp[2]=1

🥑[4]填表顺序 

很容易看出,后边泰波那契数都是由前边推导出来的,因此填表顺序为从左往右

 🧀(3)代码实现

class Solution {
public:
    int tribonacci(int n) {
        //当n为0,1,2的时候,无法推断,所以需要额外处理
        if(n==0)
            return 0;
        if(n==1||n==2)
            return 1;
         vector<int> dp(n+1);
         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];
    }
};
🥤注意一下细节:在n=0,1,2时,是无法推导出来的,因此需要额外考虑一下!!!

🧀(4)空间优化

可以推出时间复杂度和空间复杂度都为O(N)。用滚动数组方式实现,可以发现,每个泰波那契数都是通过前三个数得到的,那么我们可以将新得到的数向前滚动,从而得到新的数据。这种方式不需要建立dp表,减少空间消耗

优化后代码表示为:

class Solution {
public:
    int tribonacci(int n) {
        //当n为0,1,2的时候,无法推断,所以需要额外处理
        if(n==0)
            return 0;
        if(n==1||n==2)
            return 1;
        int a,b,c,d;
        a=0;
        b=c=1;
         for(int i=3;i<=n;i++)
         {
            d=a+b+c;
            a=b;
            b=c;
            c=d;
         }
         return d;
    }
};

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

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

相关文章

linux 创建一个线程的基础开销探讨

测试代码 测试方法比较笨&#xff0c;每修改一次线程数&#xff0c;就重新编译一次&#xff0c;再运行。在程序运行过程中&#xff0c;查看到进程 pid&#xff0c;然后通过以下命令查看进程的运行状态信息输出到以线程数为名字的日志文件中&#xff0c;最后用 vimdiff 对比文件…

LVS负载均衡集群之LVS-DR部署

目录 一、lVS-DR集群概述 二、LVS-DR数据包流向分析 四、LVS-DR特性 五、DR模式 LVS负载均衡群集部 5.0配置虚拟 IP 地址&#xff08;VIP 192.168.14.180&#xff09; 5.1.配置负载调度器(192.168.14.101) 5.2部署共享存储&#xff08;NFS服务器&#xff1a;192.168.14.10…

7-3打怪升级(25分)【Floyd、dijkstra】【2021 RoboCom 世界机器人开发者大赛-本科组(初赛)】

考点&#xff1a;Floyd&#xff0c;dijkstra变式&#xff08;记录路径&#xff0c;多优先级&#xff09; 7-3 打怪升级 (25分) 很多游戏都有打怪升级的环节&#xff0c;玩家需要打败一系列怪兽去赢取成就和徽章。这里我们考虑一种简单的打怪升级游戏&#xff0c;游戏规则是&am…

数据在计算机中的存储——【C语言】

在前面的博客中&#xff0c;我们已经学习了C语言的数据类型&#xff0c;先让我们回顾一下C语言中有哪些数据类型。 目录 C语言的基本内置类型 类型的基本归类 整型在内存中的存储 原码、反码、补码 存储中的大小端 练习 浮点型在内存中的存储 浮点数的存储规则 对引例问…

【算法与数据结构】20、LeetCode有效的括号

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;括号匹配是使用栈解决的经典问题。做这道题首先要分析什么时候括号不匹配。1、右括号多余 ( { [ ] } )…

动态规划之96 不同的二叉搜索树(第7道)

题目&#xff1a; 给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种&#xff1f;返回满足题意的二叉搜索树的种数。 示例&#xff1a; 递推关系的推导&#xff1a; n3时&#xff0c;如上图所示。 当1为头结点的时候&#x…

C#学习之路-常量

C# 常量 常量是固定值&#xff0c;程序执行期间不会改变。常量可以是任何基本数据类型&#xff0c;比如整数常量、浮点常量、字符常量或者字符串常量&#xff0c;还有枚举常量。 常量可以被当作常规的变量&#xff0c;只是它们的值在定义后不能被修改。 整数常量 整数常量可…

Mybatis-Plus查询

Mybatis-Plus Mybatis-Plus条件查询的书写方法 1.条件查询 直接new QueryQuery<>创建对象&#xff0c;然后再wrappee.eq(“数据库列表”,“匹配值”)创建条件就可以。 其中&#xff0c;基本查询&#xff1a;eq表示相等&#xff1b;gt表示大于&#xff1b;lt表示小于&a…

[Vue3]学习笔记-provide 与 inject

作用&#xff1a;实现祖与后代组件间通信 套路&#xff1a;父组件有一个 provide 选项来提供数据&#xff0c;后代组件有一个 inject 选项来开始使用这些数据 具体写法&#xff1a; 祖组件中&#xff1a; setup(){......let car reactive({name:奔驰,price:40万})provide(…

Leetcode刷题(Week1)——宽(深)度优先遍历专题

刷题时间&#xff1a; 2019/04/04 – 2019/04/07 主播&#xff1a;yxc(闫雪灿) 视频链接&#xff1a; https://www.bilibili.com/video/av32546525?fromsearch&seid14001345623296049881 题号题目链接127Word Ladderhttps://leetcode.com/problems/word-ladder/131Palind…

Integration Objects OPC 所有产品Crack

OPC产品 OPC UA 升级到 OPC UA 以提高互操作性和安全性。 OPC 隧道 无需 DCOM 即可实现安全可靠的连接。 OPC 数据归档 将 OPC 数据存储到标准数据库或 CSV 文件中。 OPC 服务器 将任何通信协议转换为OPC标准。 OPC 客户端 读取、写入和传输您的 OPC 数据。 OPC 服务器工具…

四十五、时间/空间复杂度分析

算法主要内容 一、时间复杂度分析1、由数据范围反推算法复杂度以及算法内容2、如何分析代码复杂度&#xff08;1&#xff09;看循环&#xff08;2&#xff09;看递归&#xff08;3&#xff09;一些看似为O(n^2)&#xff0c;但实际为O(n)&#xff08;4&#xff09;数据结构&…

HPM6750系列--第五篇 使用Segger Embedded Studio for RISC-V开发环境

一、目的 之前的博文中《HPM6750系列--第四篇 搭建Visual Studio Code开发调试环境》我们介绍了如何使用visual studio code进行开发调试&#xff0c;但是用起来总缺少点感觉&#xff0c;那么有没有更加友好一些的IDE用来开发呢&#xff1f; 本篇主要介绍如何使用Embedded Stud…

Stable Diffusion 模型界面介绍

Stable Diffusion 模型界面介绍 界面1 图1 Stable Diffusion 模型界面1 ①&#xff1a;选择的模型&#xff0c;及Stable Diffusion进行生成图片是使用的模型。其中.ckpt为大模型 ②&#xff1a;prompt --> 正向提示词。表示你的想法&#xff0c;你想要生成一副什么样的图…

更快更准更简单的工业异常检测新SOTA:SimpleNet

来源&#xff1a;投稿 作者&#xff1a;橡皮 编辑&#xff1a;学姐 论文链接&#xff1a;https://arxiv.org/pdf/2303.15140.pdf 代码链接&#xff1a;https://github.com/DonaldRR/SimpleNet 0.背景&#xff1a; 图像异常检测和定位任务旨在识别异常图像并定位异常子区域。…

eNSP-交换机VLAN配置

eNSP-交换机VLAN配置 文章目录 eNSP-交换机VLAN配置一、题目要求二、拓扑结构三、基础配置四、测试验证五、知识点详解1.VLAN2.VLAN的端口成员模式3.不同端口成员模式对报文的处理 一、题目要求 1.PC1可以访问PC2&#xff0c;PC4,但是不能访问PC3 2.PC2可以访问PC1&#xff0…

Python实现PSO粒子群优化算法优化BP神经网络回归模型(BP神经网络回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 PSO是粒子群优化算法&#xff08;Particle Swarm Optimization&#xff09;的英文缩写&#xff0c;是一…

openGauss学习笔记-03 openGauss极简版单节点安装

文章目录 openGauss学习笔记-03 openGauss极简版单节点安装3.1 获取安装包3.1.1 下载对应平台的安装包3.1.2 解压安装包3.1.3 查看目录结构 3.2 准备软硬件安装环境3.2.1 硬件环境要求3.2.2 软件环境要求3.2.3 软件依赖要求 3.3 单节点安装3.3.1 安装前准备3.3.2 安装openGauss…

硬件电路设计--运算放大器(四)应用三比较器

文章目录 前言电压比较器一、过零比较器二、单门比较器三、滞回比较器&#xff08;施密特触发器&#xff09;四、窗口比较器五、未使用的比较器的处理六、推挽式输出或漏极开路输出开漏输出推挽输出 七、比较器的应用7.1 3V转5V7.2 双极性转单极性7.3 光敏电阻模数转换 八、比较…

互联网协议(Internet Protocol Suite)

文章目录&#xff1a; 一&#xff1a;从系统角度&#xff08;解释互联网是如何构成的&#xff0c;协议的设计思想&#xff09; 二&#xff1a;从用户的角度&#xff08;解释结构是如何发挥作用&#xff0c;完成网络数据交换的&#xff09; 参考&#xff1a;阮一峰 一&#x…