【学会动态规划】第 N 个泰波那契数(1)

news2024/11/24 9:41:27

目录

动态规划怎么学?

1. 题目解析

2. 算法原理

1. 状态表示

2. 状态转移方程

3. 初始化

4. 填表顺序

5. 返回值

3. 代码编写

4. 空间优化

写在最后


动态规划怎么学?

学习一个算法没有捷径,更何况是学习动态规划,

跟我一起刷动态规划算法题,一起学会动态规划!

1. 题目解析

题目链接:1137. 第 N 个泰波那契数 - 力扣(Leetcode)

我们根据题目给的条件:

Tn+3 = Tn + Tn+1 + Tn + 2,也就是:Tn = Tn - 1 + Tn - 2 + Tn - 3

可以知道,第n个泰波那契数实际上就是他前三个数的和。 

2. 算法原理

1. 状态表示

一般来说,我们会先创建一个数组作为dp表,

将这个dp表填满,而答案就在这个表上的某一个位置,

而状态表示的意思就是,表上的一个值表示的含义。

不说这些虚的,那我们该怎么得出状态表示呢?

1. 根据题目要求

2. 根据我们的经验 + 题目要求

3. 分析问题的过程中,发现重复的子问题

不过这道题目比较简单,我们能直接根据题目要求得出状态表示:

dp[ i ] 表示:第 i 个泰波那契数。

2. 状态转移方程

那状态转移方程是什么呢?

实际上就是:

dp[ i ] 等于什么。

这道题比较简单,题目直接把状态转移方程的公式直接给我们了,

所以 dp[ i ] 就等于:

dp[ i ] = dp[ i - 1 ] + dp[ i - 2 ] + dp[ i - 3 ] 

3. 初始化

初识化的功能就是:

保证填表的时候不越界。

而这道题也非常贴心的给我们了:

他告诉我们:T0 = 0,T1 = 1,T2 = 1,

那我们只需要初始化:dp[ 0 ] = 0,dp[ 1 ] = 1,dp[ 2 ] = 1,即可。 

4. 填表顺序

填表顺序是为了:填写当前状态的时候,所需的状态已经计算过了,

 所以这道题我们的填表顺序就是从左往右填。

5. 返回值

实际上返回值就是返回题目要求的值啦,这道题要返回的就是:dp[ n ]

3. 代码编写

先来看题目接口:

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

我们就按照刚刚学习算法原理的顺序写代码:

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

根据我们的四部走,然后处理了一下边界的问题,然后就通过了:

4. 空间优化

我们刚开始学习动态规划的时候,最重要的是怎么把这道题做出来,

而不是想着怎么优化,所以之后不会重点来讲这个,

不过现在趁着这道题比较简单,就来优化一下,欺负一下这道题。

一般动态规划的空间优化都是用滚动数组优化,

当我们在填一个dp表的时候,只需要使用前面若干个状态,而其他状态不再需要的时候,

我们就可以使用滚动数组进行优化:

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

 这样空间消耗就从O(N)变成O(1)了。

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果感到有所收获的话可以给博主点一个哦。

如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~

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

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

相关文章

MySQL 中索引是如何实现的,有哪些类型的索引,如何进行优化索引

MySQL 中的索引 前言 上篇文章聊完了 MySQL 中的锁&#xff0c;这里接着来看下 MySQL 中的索引。 一般当我们数据库中的某些查询比较慢的时候&#xff0c;正常情况下&#xff0c;一顿分析下来&#xff0c;大多数我们会考虑对这个查询加个索引&#xff0c;那么索引是如何工作的呢…

从零开始的前后端分离项目学习(前后端从零环境搭建)

一、 前后端分离介绍&#xff1a; 前端独立编写客户端代码&#xff08;用户交互数据展示&#xff09;&#xff0c;后端独立编写服务端代码&#xff08;提供数据处理接口&#xff09;&#xff0c;并提供数据接口就行。 前端通过Ajax访问后端数据借口&#xff0c;将model展示到…

使用VESD脉冲离子风机5年内至少可节省一半的维护成本

之前的文章有给大家详细介绍过&#xff0c;来自VESD的脉冲离子风机&#xff0c;它有着特殊的设计&#xff1a;插拔式结构和可水洗针架&#xff0c;因此对我们的很多客户来说&#xff0c;这款风机性价比是非常高的。 早在15年以前&#xff0c;VESD就对市面上大部分风机进行过测试…

解决Google浏览器网页覆盖问题

在使用 Google 进行搜索的时候出现打开新页面会覆盖当前页面的问题 针对此问题&#xff0c;解决方法如下&#xff1a; 1、首先在浏览器的地址栏中随便搜索内容 2、页面的 右上角有个⚙️的设置图标&#xff0c;点进去 点击 “查看所有设置” 3、在结果打开方式中进行勾选 设…

uniapp打包APP实现应用内整包更新或热更新

思路&#xff1a; 1.首先要理解更新方式的区别 静默更新、弱更新以及强制更新。 APP更新机制-静默更新、弱更新、强更新 - 知乎 2.其次要理解不同更新方式要用到的插件----------这里推荐插件应用市场的插件。 app升级、整包更新和热更新组件 支持vue3 支持打开安卓、苹果应…

使用 SMT求解机 根据变迁关系生成迁移后系统的状态

本文的例子来源于2011年发布的论文 IC3: Where Monolithic and Incremental Meet 文章目录 Ⅰ、变迁系统的介绍状态图变迁公式 Ⅱ、SMT求解机简介公式的计算计算另一状态 结果展示参考文献 Ⅰ、变迁系统的介绍 状态图 论文中给出了一个系统的状态迁移图和它的的变迁公式。现在…

【近场社交项目】数据库系统期末设计——概念设计部分

数据库系统期末设计——概念设计部分&#x1f60e; 前言&#x1f64c;项目设计&#xff08;1&#xff09;各个实体属性ER图&#xff08;2&#xff09;各个业务功能的ER图 总结撒花&#x1f49e; &#x1f60e;博客昵称&#xff1a;博客小梦 &#x1f60a;最喜欢的座右铭&#x…

【Redis】特殊数据类型 Geo (地理位置)

&#x1f3af;前言 除了五中基本的数据类型外&#xff0c;Redis还支持两种特殊的数据类型&#xff0c;第一种 Geo (地理位置)&#xff1a;用于存储地理位置相关的数据&#xff0c;例如经纬度、距离等。第二种 Stream (流)&#xff1a;是一个高级的列表类型&#xff0c;支持对列…

Python基于pandas库导出excel文件

将Pandas数据框架导出到Excel文件中 让我们看看如何将Pandas数据框架导出到Excel文件中。 实列代码&#xff1a; import time import pandas as pd from io import BytesIO from flask import make_response,def export_navi():# 所有DataFrame合并集合df_list []# 创建一个数…

理工大学|校企联手创典范,布局存储新未来

某理工大学地质灾害防治与地质环境保护国家重点实验室的前身是1989年由原国家计委、国家教委批准&#xff0c;在某理工大学&#xff08;原某地质学院&#xff09;“地质工程”国家重点学科基础上建立的国家专业实验室&#xff0c;该实验室是我国地质灾害防治领域目前唯一的国家…

唯一无副作用禁用Win10/11更新方法,一键暂停1000周

作为一个现代化的系统&#xff0c;Windows 很早便配备了自动更新功能以快速获取新功能、修复安全漏洞。 不过到实际使用中嘛&#xff0c;自动弹出、重启自动进行、新版本大量 Bug … 体验十分糟糕。 种种原因导致&#xff0c;经常就有朋友要禁止 Win10/11 自动更新方法。 我们…

MySQL-存储函数练习

创建表并插入数据 ​ 字段名 数据类型 主键 外键 非空 唯一 自增 ​ id INT 是 否 是 是 否 ​ name VARCHAR(50) 否 否 是 否 否 ​ glass VARCHAR(50) 否 否 是 否 否mysql>…

vue项目启动前端时让本地局域网其他设备访问本项目时的配置

文章目录 编辑package.json优化 编辑package.json "dev": "vite --host [本机ip]" ,案例 优化 这样的话实用性更好&#xff0c;我们访问的话依然可以正常访问服务端的ip "dev": "vite --host 0.0.0.0" ,

Kylin麒麟系统设置开机自动登录roo账户

1.安装麒麟系统后&#xff0c;默认root用户是不开启的&#xff0c;首先得设置root用户密码命令。 sudo passwd root 此时会要求输入密码&#xff0c;输入您当前用户登录密码即可。 2.以root权限修改 /usr/share/lightdm/lightdm.conf.d/60-kylin.conf 文件,如提示输入密码&am…

itheima苍穹外卖项目学习笔记--Day1:项目介绍与开发环境搭建

苍穹外卖 Day1:a. 项目概述b. 开发环境搭建(1). 前端环境搭建(2). 后端环境搭建(3). 前后端联调 c. 完善登录功能d. Swagger Day1: a. 项目概述 b. 开发环境搭建 (1). 前端环境搭建 前端工程基于 nginx 运行启动nginx&#xff1a;双击 nginx.exe 即可启动 nginx 服务&#x…

用C语言进行学生成绩排序(简单选择排序和对堆排序)

一.选择排序 选择排序的基本思想是:每一趟(如第i趟)在后面n-i1 (i1,2…,n-1) 个待排序元素中选取关键字最小的元素&#xff0c;作为有序子序列的第i个元素&#xff0c;直到第n-1趟做完&#xff0c;待排序元素只剩下1个&#xff0c;就不用再选了。选择排序中的堆排序算法是历年考…

IDEA配置Maven教程

IDEA配置Maven教程 &#x1f495;1、mavne的下载&#x1f495;2、maven的安装&#x1f49e;3、配置Maven环境变量&#x1f49e;4、配置 Maven 本地仓库存放路径&#x1f496; 5、settings.xml配置&#xff1b;&#x1f496;6、IDEA配置maven&#xff1b;&#x1f496;7、清理下…

不容小觑:MES系统上线后绝对不能大意的几点

随着工业自动化和信息化的普及&#xff0c;制造执行系统&#xff08;MES&#xff09;已经成为现代制造企业的重要组成部分。然而&#xff0c;即使在实施MES系统之后&#xff0c;企业仍然不能掉以轻心。本文将探讨MES系统上线后需要引起注意的几个方面&#xff0c;以帮助企业更好…

SolidWorks如何切换语言选项

一些工程师的电脑上安装的上英文操作系统&#xff0c;这种操作系统如果安SolidWorks的话&#xff0c;即已经安装上中文语言包&#xff0c;但打开SolidWorks后&#xff0c;其界面还是英文界面。如何在英文Windows操作系统中运行中文版的SolidWorks呢&#xff1f; 照成以上问题可…

Maven下载和配置教程:Windows、Mac和Linux系统安装指南

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…