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

news2024/11/18 3:46:18

个人主页:平行线也会相交
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创
收录于专栏【手撕算法系列专栏】【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比较小的时候可能会造成越界)。

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

在这里插入图片描述

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

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

相关文章

【C/C++】数组指针:array 地址 array *parray 两次解引用 **parray 值相同的原因解析

一、提出问题 #include <stdio.h>int main() { char array[16] {A, B}; char (*parray)[16] &array; printf("\n");printf(" array: \t%#lx\n", array); printf("& array: \t%#lx\n", &array); printf("…

SQL server 2012 配置数据库邮件实现邮件发送

日常开发中经常遇到邮件推送场景&#xff0c;我们可以利用SQL server也可以实现邮件发送功能。 一、配置邮件服务器 然后再弹出的页面中选择下一步 输入配置文件名&#xff0c;并添加新用户 在弹出的页面配置邮件服务器的地址、用户名、密码等相关信息 以上信息完成&#xff0…

树莓派 Raspberry Pi Zero 2W 安装默认系统时 ssh 登录并开启摄像头推流一段时间B

Raspberry Pi Zero 2W有点鸡肋&#xff0c;hdmi口用的microhdmi口&#xff0c;不是树莓派4b的minihdmi口&#xff0c;然后zero 2W也没有usb接口&#xff0c;有一个microusb安卓的otg接口&#xff0c;很烦&#xff0c;还好有wifi蓝牙模块&#xff0c;这样子还能ssh&#xff0c;不…

【冒泡排序】

前言 在计算机科学中&#xff0c;排序算法是一种常见且重要的算法。排序算法的目标是将一组无序的数据按照一定的规则进行重新排列&#xff0c;以便更方便地进行搜索、查找或其他操作。 冒泡排序&#xff08;Bubble Sort&#xff09;是最简单的排序算法之一&#xff0c;它的原…

基于Python+MySQL所写的商城管理系统

点击以下链接获取源码资源&#xff1a; https://download.csdn.net/download/qq_64505944/87971437?spm1001.2014.3001.5503 《51商城》程序使用说明 51商城项目分为网站前台和后台两个部分&#xff0c;下面将分别介绍这2个部分的使用。 1.网站前台 在虚拟环境中启动程序后&a…

Callback自定义测试-业务安全测试实操(23)

Callback自定义测试 测试原理和方法 在浏览器中存在着同源策略,所谓同源是指域名、协议、端口相同。当使用Aiax异步传输数据时,非同源域名之间会存在限制。其中有一种解决方法是JSONP (JSONwithPadding),基本原理是利用了HTML里<script></script>元素标签,远程…

Python 对象拷贝的那点事?

1.变量&#xff0c;引用和对象 变量无类型&#xff0c;它的作用仅仅在某个时候引用了特定的对象而已&#xff0c;具体在内存中就是一个指针&#xff0c;仅仅拥有指向对象的空间大小。 变量和对象的关系在于引用&#xff0c;变量引用对象后&#xff0c;也就对应了赋值的过程。…

VBA快速合并数据

实例需求&#xff1a;原始数据保存在工作表的A列至C列&#xff0c;现需要根据材料编号合并交付日期和交付数量&#xff0c;并且交付日期的日期格式采用两位数字年份简写格式&#xff0c;合并后的数据保存在E列和F列&#xff0c;如下图所示。 示例代码如下。 Sub demo()Dim o…

MSP430F249 Proteus仿真数码管秒表-0050

MSP430F249 Proteus仿真数码管秒表-0050 Proteus仿真小实验&#xff1a; MSP430F249 Proteus仿真数码管秒表-0050 功能&#xff1a; 硬件组成&#xff1a;MSP430F249单片机 2位数码管2个按键&#xff08;清零 开始/暂停&#xff09; 1.点击开始键后数码管开始秒表计时0~9…

Spring Cloud - HTTP 客户端 Feign 、自定义配置、优化、最佳实践

目录 一、Feign 是什么&#xff0c;有什么用呢&#xff1f; 二、Feign 客户端的使用 2.1、远程调用 1.引入依赖 2.在order-service&#xff08;发起远程调用的微服务&#xff09;的启动类添加注解开启Feign的功能 3.编写 Feign 客户端 4.通过 Feign 客户端发起远程调用 …

附件1.服务器操作系统安全加固要求及配置建议【上】

文章目录 加固文件说明【重启auditd服务后/etc/audit/audit.rules文件内容消失怎么处理】【用户的的本地登录和远程登录默认都会被审计&#xff1b; 2&#xff0c;可配置对chown、chmod、chcon等命令的执行进行审计&#xff1b;【ssh会话默认会被审计&#xff1b;】【可添加审计…

kafka入门用这一篇就够了!

目录 1&#xff0c;kafka简单介绍 2&#xff0c;kafka使用场景 3&#xff0c;kafka基本概念 kafka集群 数据冗余 分区的写入 读取分区数据 顺序消费 提交策略 零拷贝技术&#xff08;netty&#xff09; 1&#xff0c;kafka简单介绍 kafka是一款分布式、支持分区的、多…

3.springboot开发篇

SpringBoot开发实用篇 ​ KF-1.热部署 热部署是不用重启项目&#xff0c;项目自动更新 非springboot项目热部署实现原理 ​ 开发非springboot项目时&#xff0c;我们要制作一个web工程并通过tomcat启动&#xff0c;通常需要先安装tomcat服务器到磁盘中&#xff0c;开发的程序…

【openGauss数据库】--运维指南02-逻辑备份与恢复

【openGauss数据库】--运维指南02-逻辑备份与恢复 &#x1f53b; 一、 openGauss数据库备份与恢复概述&#x1f530; 1.1 备份与恢复类型&#x1f530; 1.2 类型对比 &#x1f53b; 二、 配置文件的备份与恢复&#x1f53b; 三、逻辑备份----gs_dump & gs_dumpall&#x1…

Uipath Excel 实战01-自动生成流水号最佳方法

Uipath RPA 自动生成流水号最佳方法&#xff0c;提高RPA 性能&#xff0c;速度毫秒级。通过本案例将学会Excel 写入单元格、Excel 自动填充公式、Excel 自动调整列范围、保存Excel 文件以及使用Excel 函数。 公式参考&#xff1a; Excel公式参考&#xff1a; Excel CONCATENAT…

动态规划——地下城游戏

题目链接 leetcode在线oj题——地下城游戏 题目描述 恶魔们抓住了公主并将她关在了地下城 dungeon 的 右下角 。地下城是由 m x n 个房间组成的二维网格。我们英勇的骑士最初被安置在 左上角 的房间里&#xff0c;他必须穿过地下城并通过对抗恶魔来拯救公主。 骑士的初始健…

chatgpt赋能python:线上免费Python教程推荐

线上免费Python教程推荐 Python作为一门简单易学的编程语言&#xff0c;在各个行业和领域都越来越受欢迎。很多人想学Python&#xff0c;但是可能因为费用等问题而卡住了。今天&#xff0c;我们来介绍一些免费的Python教程&#xff0c;帮助那些想要学习Python但没有预算的人。…

上手vue2的学习笔记2之安装vue的踩坑经历

上一篇笔记 上手vue2的学习笔记1之了解前端三剑客&#xff0c;简单介绍了学习vue框架之前应该具备的基础知识和四个我认为非常有用的学习链接&#xff0c;建议大家动手实践一下&#xff0c;更多深刻的理解前端三剑客之间的关系。 这一篇笔记主要介绍我在安装vue过程中遇到的坑…