【手撕算法|动态规划系列No.1】leetcode1137. 第 N 个泰波那契数

个人主页:平行线也会相交
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创
收录于专栏【手撕算法系列专栏】【LeetCode】
🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助
🍓希望我们一起努力、成长,共同进步。
在这里插入图片描述

点击直接跳转到该题目

目录

  • 🍬题目描述
  • 🍦动态规划算法原理+题目解析。
  • 🍰解题代码1
  • 🍔解题代码2(空间优化---滚动数组)
  • 🍩总结

🍬题目描述

泰波那契序列 Tn 定义如下:

T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2

给你整数 n,请返回第 n 个泰波那契数 Tn 的值。

示例 1:

输入:n = 4
输出:4
解释
T_3 = 0 + 1 + 1 = 2
T_4 = 1 + 1 + 2 = 4

示例 2:

输入:n = 25
输出:1389537

🍦动态规划算法原理+题目解析。

这里要求的是第n个泰波那契数,泰波那契数不同于斐波那契数,两者区别如下:

斐波那契数列以0和1为初始值,每个数字是前两个数字的和,形成的数列是0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …。
泰波那契数列以0、1和1为初始值,每个数字是前三个数字的和,形成的数列是0, 1, 1, 2, 4, 7, 13, 24, 44, …。

说白了,第n个泰波那契数其实就是前面3项加起来的和。用一个公式来表示就是Tn = Tn-3 + Tn-2 + Tn-1

现在我们先来简单介绍一下什么是动态规划。

动态规划算法通过将问题分解成子问题,并利用子问题的解推导出更大规模问题的解,避免了重复计算,从而提高了算法的效率。

我们今后在练习动态规划的题目的时候,一般会按照如下几个步骤进行题目的分析、解答。请看:
步骤1(最重要).状态表示

状态表示是什么意思呢?我们要先建立一个dp表(一般是一个一维数组或者二维数组),状态表示其实就是dp表中每个位置的具体含义。
那我们应该如果来求取题目的状态表示呢?状态表示又是怎么来的?这里给出了3种方法,请看:
①根据题目要求,题目怎么要求的我们就怎么来
②(重点)根据自己的经验+题目要求
③分析问题的过程中,发现了重复的子问题

在这里插入图片描述

由于这个题目(第 N 个泰波那契数)比较简单,所以我们可以直接根据题目要求来得到题目的状态表示。在本题目中,dp表即dp[i]就表示第 N 个泰波那契数。

步骤2(最难):状态转移方程

我们先来看看官方是怎么定义状态转移方程的,请看:找到子问题之间的递推关系,即通过已知子问题的解推导出更大规模的子问题的解。
其实说简单一点,就是求dp[i]等于什么
在本题目中,dp[i]=d[i-3]+d[i-2]+dp[i-1]

步骤3:初始化

步骤3就是根据状态转移方程来填表,而且必须保证填表的时候不能越界
在本题目中,根据状态转移方程dp[i]=d[i-3]+d[i-2]+dp[i-1]来进行初始化,由于必须要保证不越界,所以根据题目要求,我们只需要初始化dp[0]=0、dp[1]=1、dp[2]=1

步骤4:填表顺序

为了填写当前状态的时候,所需要的状态已经计算过了。
这里举个例子,我们已经知道了dp[0]、dp[1]、dp[2]位置的状态,可以根据这三个位置的状态来填写dp[3]。但是我们如果想要知道dp[4]的话,我们就需要三个位置的状态(即dp[1]、dp[2]、dp[3]位置的状态)。

步骤5:返回值

由于这里dp[i]表示第i个泰波那契数,所以dp[n]就表示第n个泰波那契数。所以这里返回值很简单
,我们直接返回dp[i]就好了。

以上就是动态规划的几个基本的步骤。

🍰解题代码1

class Solution {
public:
    int tribonacci(int n) {

        //处理越界问题
        if(n==0) return 0;
        if(n==1||n==2) return 1;
        //创建dp表
        vector<int> dp(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(空间优化—滚动数组)

我们可以对本题进行一个空间优化,即利用滚动数组。
那这里是怎样一个空间优化呢?我们先来分析一下在哪里我们可以进行空间优化。

就比如说我们在求取dp[4]的值的时候需要用到dp[1]、dp[2]、dp[3]的值,而dp[0]的值是用不到的;
所以这里就造成了一部分空间的浪费。
在比如说,我们在求取dp[6]的值的时候需要用到dp[3]、dp[4]、dp[5]的值,而dp[0]、dp[1]、dp[2]的值是用不到的;所以这里一下子就造成了dp[0]、dp[1]、dp[2]所占空间的浪费。

在这里插入图片描述

需要注意的是,当我们在进行变量a、b、c的赋值操作的时候,必须从前往后赋值,而不能从后往前赋值。

总结:当我们一次求取dp[i]的时候,前面的某些状态如果可以舍去,仅仅使用中间有效的若干个状态,这种情况我们就可以使用滚动数组来解决问题。
下面来看解题代码,请看:

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;
    }
}

🍩总结

本文搭配题目主要讲解了动态规划的大体思路:

分析题目时主要有5个步骤,分别是状态表示、状态转移方程、初始化、顺序填表、返回值
写代码时主要有4个步骤:分别是创建dp表、初始化、填表、返回值,最后一定要处理边界问题(比如当n比较小的时候可能会造成越界)。

好了,以上就是本文的全部内容,希望可以帮到大家。
那就再见啦,友友们!!!

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

exe的python文件打包

【步骤01】 【在命令行中用pip工具安装Pyinstaller模块】 pip install Pyinstaller 步骤02】 【切换命令行的路径到你要打包的Python源文件的文件夹路径下】 【下面是我要打包的Python源文件&#xff08;散点坐标图.py&#xff09;及其文件夹路径】 【步骤03】 【执行Pyi…

使用SSH远程直连Docker容器

文章目录 1. 下载docker镜像2. 安装ssh服务3. 本地局域网测试4. 安装cpolar5. 配置公网访问地址6. SSH公网远程连接测试7.固定连接公网地址8. SSH固定地址连接测试 转载自cpolar极点云文章&#xff1a;SSH远程直连Docker容器 在某些特殊需求下,我们想ssh直接远程连接docker 容器…

SpringBoot 实现 elasticsearch 查询操作(RestHighLevelClient 的案例实战)

文章目录 1. 环境准备1. 查询全部2. 根据 name 查询 match 分词查询3. 根据 name 和 品牌查询 multiMatch 分词查询4. 根据 brand 查询 match 分词查询5. 按照价格 范围查询6. 精确查询7. boolQuery8. 分页9. 高亮查询9. 公共解析 上一节讲述了 SpringBoot 实现 elasticsearch …

【图像处理OpenCV(C++版)】——5.3 图像平滑之均值平滑(滤波)

前言&#xff1a; &#x1f60a;&#x1f60a;&#x1f60a;欢迎来到本博客&#x1f60a;&#x1f60a;&#x1f60a; &#x1f31f;&#x1f31f;&#x1f31f; 本专栏主要结合OpenCV和C来实现一些基本的图像处理算法并详细解释各参数含义&#xff0c;适用于平时学习、工作快…

Linux终端与进程的关系 ( 1 ) -【Linux通信架构系列】

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 期待你的关注哦&#xff01;&#xff01;&#xff01; 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everything is for the…

C高级重点

1、请简要描述一下Linux文件系统的层级结构&#xff0c;包括不同目录的作用和功能。 Linux的文件系统结构是一个倒插树结构&#xff0c;所有的文件都从根目录出发。 2、find指令的用途 find 查找的路径 -name 文件名 ----->在指定路径下&#xff0c;以文件名为条件查找文…

总结vue3 的一些知识点:​Vue3 起步

目录 引言 Vue3 混入 实例 选项合并 实例 实例 全局混入 实例 Vue3 起步 Vue 3.0 实例 data 选项 实例 方法 总结 引言 Vue 进阶系列教程将在本号持续发布&#xff0c;一起查漏补缺学个痛快&#xff01;若您有遇到其它相关问题&#xff0c;非常欢迎在评论中留言讨…

Ubuntu 20.04.02 LTS安装virtualbox7.0

ubuntu22.04的软件仓库也有virtualbox&#xff0c;不过版本较老。 使用安装命令&#xff1a;sudo apt install virtualbox 如果想要安装最新版&#xff0c;那么需要去官网下载deb包或者使用官方的仓库。 这里采用安装Oracle官方仓库的方法。 执行如下命令&#xff1a; wge…

HTTP调用:你考虑到超时、重试、并发了吗?

今天&#xff0c;我们一起聊聊进行 HTTP 调用需要注意的超时、重试、并发等问题。 与执行本地方法不同&#xff0c;进行 HTTP 调用本质上是通过 HTTP 协议进行一次网络请求。网络请求必然有超时的可能性&#xff0c;因此我们必须考虑到这三点&#xff1a; 首先&#xff0c;框架…

抖音本地生活团购服务商

抖音本地生活团购服务商市场前景非常广阔。随着移动互联网的普及和人们对本地生活服务需求的增加&#xff0c;本地生活团购行业已成为一个快速增长的市场。而抖音平台拥有庞大的用户基础和强大的社交媒体传播力&#xff0c;为本地生活团购服务商提供了巨大的发展机遇。 抖音…

【博客674】警惕Prometheus 中的重复样本和无序时间戳错误

警惕Prometheus 中的重复样本和无序时间戳错误 1、场景 您的 Prometheus 服务器日志中是否遇到过以下错误&#xff1f; "Error on ingesting out-of-order samples" "Error on ingesting samples with different value but same timestamp" "dupli…

图解CNN中的卷积(卷积运算、池化、Padding、多通道的卷积)

文章目录 卷积操作池化Padding对多通道&#xff08;channels&#xff09;图片的卷积套上激活函数是什么样的参考&#xff1a; 卷积层是深度学习神经网络中经常使用的一种层。它通过卷积运算来提取输入的特征&#xff0c;常用于图像、语音等信号处理任务中。 卷积层有以下几个参…

探索iOS之Metal编程指南

iOS推出Metal渲染库为了取代OpenGL。Metal有自己的Shader语言&#xff0c;渲染效率比OpenGL高。在这里我们一起探索&#xff1a;Metal使用C限制、预处理定义、动态链接配置、GPU编译配置、设备坐标系、视口坐标系、纹理坐标系、矢量类型、矩阵类型、采样器状态、矩阵相乘。 1、…

第 107 场LeetCode双周赛

A 最大字符串配对数目 显然各字符串对 间匹配的先后顺序不影响最大匹配数目, 可以从后往前遍历数组, 判断前面是否有和当前末尾构成匹配的. class Solution { public:int maximumNumberOfStringPairs(vector<string> &words) {int res 0; while (words.size…

使用 Jetpack Compose 构建 RadioButton

欢迎阅读本篇关于使用 Jetpack Compose 构建 RadioButton&#xff08;单选按钮&#xff09;的博客。Jetpack Compose 是 Google 发布的现代化 UI 工具包&#xff0c;用于构建 Android 界面。它的声明式设计使得 UI 开发更加简洁直观。 一、什么是 RadioButton&#xff1f; Rad…

【深度学习】3-4 神经网络的学习- 学习算法的实现

神经网络的学习步骤如下所示&#xff1a; 步骤1(mini-batch) 从训练数据中随机选出一部分数据&#xff0c;目标是减小mini-batch的损失函数的值 步骤2(计算梯度) 为了减小mini-batch的损失函数的值&#xff0c;需要求出各个权重参数的梯度 步骤3(更新参数) 将权重参数沿梯度…

ModaHub魔搭社区:向量数据库MIlvus服务端配置(四)

目录 常见问题 常见问题 除了配置文件外&#xff0c;怎样可以判断我确实在使用 GPU 做搜索&#xff1f; 有以下三种方式&#xff1a; 使用 nvidia-smi 命令查看 GPU 使用情况。用 Prometheus 配置&#xff0c;详见 使用 Grafana 展示监控指标 > 系统运行指标。使用 Milv…

【完美复现】面向配电网韧性提升的移动储能预布局与动态调度策略【IEEE33节点】(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

制造企业实施MES系统受到的影响因素有哪些?

实施MES系统会遇到哪些影响因素&#xff1f;或者说企业实施MES系统的交付率为什么低&#xff1f; 我觉得关键点在于&#xff1a;在当前MES产品化程度普遍不高的大环境下&#xff0c;对项目及管理软件本身认知过于简单&#xff0c;且缺失有经验行业人才&#xff0c;是当前大部分…

windows下安装Visual Studio + CMake+OpenCV + OpenCV contrib+TensorRT

目录 1 安装visual studio 2 安装CMake 3 OpenCV源码安装 3.1 OpenCV源码下载 3.2 OpenCV contrib源码下载 3.3 安装OpenCV 3.4 安装OpenCV-crontrib 3.5 VS生成代码 4 环境配置 5 TensorRT安装 5.1 TensorRT安装 5.2 Python下安装TensorRT库 最近在研究windows系统…