当前位置: 首页 > news >正文

求第 N 个泰波那契数 | 动态规划

1.第 N 个泰波那契数

题目连接:1137. 第 N 个泰波那契数
泰波那契序列 Tn 定义如下:
T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2给你整数 n,请返回第 n 个泰波那契数 Tn 的值。

2.什么是动态规划

在解决这道问题之前先来了解一下,什么是动态规划。动态规划(Dynamic Programming):简称 DP,是一种求解多阶段决策过程最优化问题的方法。简单的理解,把原问题分解为相对简单的子问题,先求解子问题,再由子问题的解而得到原问题的解。
它的核心思想是,把「原问题」分解为「若干个重叠的子问题」,将子问题计算出来的结果存放到一张dp表中,通过dp表中过往计算的结果,来减少计算并计算出原问题。
它的解题步骤大致分为五个过程:状态表⽰、状态转移⽅程、初始化、填表顺序、返回值!

3.解决问题

(1)、状态表示
我们需要将子问题存放到,一张dp表中,而dp[i]就表示状态。对应这里的状态即为,dp[i] = 第 i 个泰波那契数的值。
(2)、状态转移⽅程
这道题,就已经将状态转移方程给出,我们稍微变形:dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3]
(3)、初始化
由于dp[0],dp[1],dp[2]的数值题目以给出,直接将值填入dp表中,完成初始化。初始化时需要注意,确保dp表下标不要越界。
(4)、初始化顺序
这里根据题目要求,根据状态转移方程,将dp填充。
(5)、返回值
返回dp[n]即为,返回结果。

4.参考代码

C++版本:

class Solution 
{
public:int tribonacci(int n) {vector<int> dp(n + 3,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];}
};

Python3版本:

class Solution:def tribonacci(self, n: int) -> int:list = [0, 1, 1]for i in range(3, n + 1):next_value = list[i - 3] + list[i - 2] + list[i - 1]list.append(next_value)return list[n]
5.空间优化

在上面的代码当中,空间的复杂度为O(N)。关于这道题,我们求出dp[n]的值,只需要求n前三个状态。所以我们就可以使用滚动数组的方案来优化空间。如果,求dp[n]只需要n前的若干个状态,那么就可以使用滚动数组优化。
在这里插入图片描述
优化代码C++版本:

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,c] 不能后往前赋值[c,b,a]a = b;b = c;c = d;}return d;}
};

相关文章:

  • 教你用U-Mail搭建一个企业邮箱系统
  • ArcGIS Maps SDK for JS:使用queryFeatures方法查询 FeatureLayer 中符合条件的要素
  • 深入浅出:探索堆内存与分配器的奥秘
  • Vue.js Promise 与 async/await 的比较
  • MyBatisPlus使用流程
  • AI--向量的存储和检索
  • Java开发大厂面试第20讲:什么是分布式锁?Redi 怎样实现的分布式锁?
  • 如何为ChatGPT编写有效的提示词:软件开发者的指南
  • Servlet的response对象
  • 爬虫实训案例:中国大学排名
  • [保姆式教程]使用目标检测模型YOLO V8 OBB进行旋转目标的检测:训练自己的数据集(基于卫星和无人机的农业大棚数据集)
  • 大模型日报|今日必读的 13 篇大模型论文
  • 【html5】03-新表单元素及属性
  • VUE面试题(3)--vue常见面试题
  • 使用API有效率地管理Dynadot域名,进行域名邮箱的默认邮件转发设置
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • [Vue CLI 3] 配置解析之 css.extract
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • Akka系列(七):Actor持久化之Akka persistence
  • input的行数自动增减
  • JavaScript-Array类型
  • MYSQL 的 IF 函数
  • Nacos系列:Nacos的Java SDK使用
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • python3 使用 asyncio 代替线程
  • Rancher-k8s加速安装文档
  • 初识MongoDB分片
  • 反思总结然后整装待发
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 十年未变!安全,谁之责?(下)
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 项目实战-Api的解决方案
  • 中文输入法与React文本输入框的问题与解决方案
  • nb
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • !!Dom4j 学习笔记
  • # include “ “ 和 # include < >两者的区别
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (003)SlickEdit Unity的补全
  • (10)ATF MMU转换表
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (ZT)一个美国文科博士的YardLife
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (学习日记)2024.02.29:UCOSIII第二节
  • (一)认识微服务
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (杂交版)植物大战僵尸
  • (转)visual stdio 书签功能介绍
  • (转载)Google Chrome调试JS
  • .axf 转化 .bin文件 的方法
  • .a文件和.so文件
  • .NET 反射的使用