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

【动态规划专栏】专题一:斐波那契数列模型--------1.第N个泰波那契数

本专栏内容为:算法学习专栏,分为优选算法专栏,贪心算法专栏,动态规划专栏以及递归,搜索与回溯算法专栏四部分。 通过本专栏的深入学习,你可以了解并掌握算法。

💓博主csdn个人主页:小小unicorn
⏩专栏分类:动态规划专栏
🚚代码仓库:小小unicorn的代码仓库🚚
🌹🌹🌹关注我带你学习编程知识

专题一

  • 题目来源
  • 题目描述
  • 题目解析
  • 算法原理
    • 1.状态表示
    • 2.状态转移方程
    • 3.初始化
    • 4.填表顺序
    • 5.返回值
  • 代码实现

题目来源

本题来源为:

Leetcode1137. 第 N 个泰波那契数

题目描述

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

在这里插入图片描述

题目解析

这里我们首先可以先将题目的公式变形一下:
在这里插入图片描述
通过一个简单例子来理解此题目:
在这里插入图片描述
T0 T1 T2值题目中已经给出,而T4的值是T0 +T1+ T2的结果,而T5的值是T1 +T2+ T3的结果,依次内推…

算法原理

在讲解此题的算法原理之前,我们先了解一下动态规划:
[动态规划 dynamic programming」是一个重要的算法范式,它将一个问题分解为一系列更小的子问题,并通过存储子问题的解来避免重复计算,从而大幅提升时间效率。

可能此概念对于初学者来说很抽象,我们通过本题为例,给出动态规划的一般解决思路:

动态规划做题流程,一般会定义一个dp(动态规划的缩写)(一位或者二维数组)

然后想办法把里面的值给填满,里面的某一个值可能就是我们的最终结果!

举个例子:
在这里插入图片描述

动态规划基本上分为五步:
1.状态表示
2.状态转移方程
3.初始化
4.填表顺序
5.返回值

其中状态转移方程由状态表示推出,而3.4.5步则为处理细节问题。
接下来将通过本题为例来讲解这五步如何处理:

1.状态表示

首先什么是状态表示呢?
简单点的说:状态表示就是dp表里面值的含义

那么具体怎么知道里面值所代表的含义呢?
基础有三种方式

1.1题目要求
1.2经验+题目要求(大多数)
1.3分析问题过程中,发现重复子问题(难点)

当然也不仅仅与此,后面也会再接触更多的方法!
那么根据本题目要求,
dp[i]表示:第i个泰波那契的值
在这里插入图片描述

2.状态转移方程

状态转移方程是什么?
通俗来说,就是推出一个式子,让dp[i]等于什么

根据本题要求,我们计算一个值时,需要知道它前面的三个值。
在这里插入图片描述
计算i位置的值(dp[i])时,需要知道i-1,i-2,i-3的值,那么i-1位置的值又怎么求呢?在回顾一下我们的状态表示,dp[i]表示:第i个泰波那契的值 那么i-1位置的值不就是dp[i-1],以此内推…

分析到这,我们的状态转移方程已经出来了:
在这里插入图片描述

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

3.初始化

什么是初始化?
就是要保证填表的时候不越界
在这里插入图片描述
那么怎么填,其实就是根据状态转移方程,害怕越界访问,进行相关初始化 而本题的题目其实已经告诉我们了:
在这里插入图片描述
当i为0,1,2时就会产生越界访问,而本题的题目已经将这三个位置的值已经告诉我们了:
因此初始化为:

dp[0]=0
dp[1]=1
dp[2]=2

4.填表顺序

根据状态转移方程,我们计算dp[i]位置的值需要i-1与i-2位置的值,因此我们的填表顺序为:从左往右

5.返回值

根据题目要求返回第 n 个泰波那契数 Tn 的值。
而我们的状态表示 :dp[i]表示:第i个泰波那契的值

因此返回dp[n]

代码实现

动态规划的代码基本就是固定的四步:

1.创建dp表
2.初始化
3.填表
4.返回值
class Solution 
{
public:int tribonacci(int n) {// 1.创建dp表// 2.初始化// 3.填表// 4.返回值//处理一下边界情况:if(n==0)return 0;if(n==1||n==2)return 1;//创建dp表vector<int> dp(n+1);//初始化dp[0]=0;dp[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];}
};

注意n的取值范围:

0 <= n <= 37

因此要处理一下边界情况:

 //处理一下边界情况if(n==0)return 0;if(n==1||n==2)return 1;

时间复杂度:O(N)
空间复杂度:O(N)

http://www.lryc.cn/news/302498.html

相关文章:

  • 自养号测评低成本高效率推广,安全可控
  • ubuntu22.04@laptop OpenCV Get Started: 015_deep_learning_with_opencv_dnn_module
  • 【elk查日志 elastic(kibana)】
  • RapidMiner数据挖掘2 —— 初识RapidMiner
  • 基于STM32的光照检测系统设计
  • 车辆管理系统设计与实践
  • 板块一 Servlet编程:第四节 HttpServletResponse对象全解与重定向 来自【汤米尼克的JAVAEE全套教程专栏】
  • 漫谈:C/C++ char 和 unsigned char 的用途
  • 安全保护制度
  • 沁恒CH32V30X学习笔记07---多功能按键框架使用
  • 如何看显卡是几G?
  • 虚拟机--pc端和macOS端互通
  • (14)Hive调优——合并小文件
  • Linux 驱动开发基础知识——LED 模板驱动程序的改造:设备树(十一)
  • 学习文档:QT QTreeWidget及其代理
  • 代码随想录算法训练营——总结篇
  • 更改WordPress作者存档链接author和用户名插件Change Author Link Structure
  • Kernelized Correlation Filters KCF算法原理详解(阅读笔记)(待补充)
  • 安卓游戏开发之图形渲染技术优劣分析
  • python+django+vue汽车票在线预订系统58ip7
  • 2024-2-19
  • ARM体系在linux中的中断抢占
  • STM32的FLASH操作
  • electron Tab加载动画开启和关闭
  • 深度学习发展的艺术
  • las数据转pcd数据
  • HTTP缓存技术
  • USACO 2024年1月铜组 MAJORITY OPINION
  • Windows 重启 explorer 的正确做法
  • linux基础学习(10):基本权限与相关命令