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

目录

动态规划怎么学?

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.hqwc.cn/news/18587.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue2 若依项目,使用plotly.js-dist图表库,将数据图表一键导出为图片

此代码适用的场景是一个页面有多个数据图表。 首先需要拿到你生成数据图表的数据&#xff0c; 然后赋值给一个数组&#xff0c;数组需要在data定义&#xff0c;还需要去重。 // 检查是否有相同的parameter值const hasDuplicate this.toImageArr.some(iiem > iiem.paramete…

C++万字自学笔记

[TOC] 一、 C基础 C的IDE有CLion、Visual Studio、DEV C、eclipse等等&#xff0c;这里使用CLion进行学习。 0. C初识 0.1 第一个C程序 编写一个C程序总共分为4个步骤 创建项目创建文件编写代码运行程序 #include <iostream>int main() {using namespace std;cout…

【SpringBoot_Error】关于SpringBoot项目中经常出现yml/xml识别不到的问题

Problems 关于关于SpringBoot项目中经常出现yml/xml识别不到的问题 Solution 在pom.xml文件的<build></build>标签中添加如下代码&#xff1a; > <build><resources><!--检测mapperxml&#xff0c;本项目数据访问层的SQL xml文件放在Java包…

nginx配置例子-反向代理实现

4.1 反向代理实现&#xff08;实例1&#xff09; 4.1.1需要实现的效果 (1)打开浏览器&#xff0c;在浏览器地址栏输入地址 www.123.com&#xff0c;跳转到liunx.系统tomat主页面中 4.1.2 准备工作 (1&#xff09;在liunx, 系统安装 tomcat, 使用默认端口8080. tomcat安装文…

学习python爬虫需要掌握哪些库?

目录 常见的几种爬虫库 1. Requests 2. BeautifulSoup 3. Selenium 4. Scrapy 5. Urllib 6. Scrapy-Redis 7. Pillow 示例代码 1. Requests 2. BeautifulSoup 3. Selenium 4. Scrapy 5. Urllib 6. Scrapy-Redis 7. Pillow 总结 常见的几种爬虫库 在学习Python爬…

Abandoning the Bayer-Filter to See in the Dark 论文阅读笔记

这是CVPR2022的一篇暗图增强的文章&#xff0c;TCL AI Lab与福州大学&#xff0c;韩国延世大学&#xff0c;安徽大学的合作论文网络以黑暗环境下拍摄的color raw为输入&#xff0c;用一个de-bayer-filter module恢复无拜尔滤波器的raw data&#xff08;文章认为拜尔滤波器使得光…

微服务是SOA,微服务也不是SOA

文章目录 一、什么是SOA&#xff1f; 什么是微服务&#xff1f;SOA 和微服务的区别 公众号&#xff1a; MCNU云原生&#xff0c;文章首发地&#xff0c;欢迎微信搜索关注&#xff0c;更多干货&#xff0c;第一时间掌握&#xff01; 本文源自一次面试官的提问&#xff1a;你觉得…

SwinIR Transformer训练教程(使用自己的数据集)

使用自己的数据集训练SwinIR Transformer SwinIR Transformer图像超分辨率重建训练教程 目录 使用自己的数据集训练SwinIR Transformer一、使用MATLAB对数据集进行BICUBIC插值下采样二、使用MATLAB对数据集进行BICUBIC插值下采样三、训练3.1 下载训练源代码3.2 修改json文件3.…

linux开发工具:git

文章目录 1&#xff1a;Git简介2&#xff1a;Git简明指南2.1&#xff1a;创建新仓库2.2&#xff1a;检出仓库2.3&#xff1a;工作流2.4&#xff1a;添加和提交2.5&#xff1a;推送改动2.6&#xff1a;分支2.7&#xff1a;更新与合并2.8&#xff1a;标签2.9&#xff1a;替换本地…

【数据结构】非线性结构之树结构(含堆)

前言 前面的三篇文章已经将线性结构讲述完毕了&#xff0c;下面的文章将会为大家将讲点新东西&#xff1a;非线性结构中的树结构。萌新对这里的知识点相对陌生&#xff0c;建议反复观看&#xff01;&#xff01; 关于线性结构的三篇文章放在下面&#xff1a; 线性表之顺序表 线…

Kafka传输数据到Spark Streaming通过编写程序java、scala程序实现操作

一、案例说明 现有一电商网站数据文件&#xff0c;名为buyer_favorite1&#xff0c;记录了用户对商品的收藏数据&#xff0c;数据以“\t”键分割&#xff0c;数据内容及数据格式如下&#xff1a; 二、前置准备工作 项目环境说明 Linux Ubuntu 16.04jdk-7u75-linux-x64scal…

Hadoop知识点

1.HDFS写数据流程 客户端通过Distributed FileSystem模块向NameNode请求上传文件&#xff0c;NameNode检查目标文件是否已存在&#xff0c;父目录是否存在。NameNode返回是否可以上传。客户端请求第一个 Block上传到哪几个DataNode服务器上。NameNode返回3个DataNode节点&#…