动态规划| 【斐波那契数列模型 】|1137.第N个泰波那锲数

简介: 动态规划| 【斐波那契数列模型 】|1137.第N个泰波那锲数



力扣题目链接:

题目

第N个泰波那锲数

泰波那契序列 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

思路

普通思路

       看到这个的时候,我们会想到我们之前学的那个斐波那契数,实际上,这两个确实是有联系的,是同一个类型的,分析给出的泰波那锲数列的定义“T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2”先是给出这个数列的前三个值,后又给出一个公式,这个公式不难看出,第n 项等于前三项之和,前提是n大于等于3,为什么要大于等于三呢,这是因为,这个数列从第0项开始,如果n是第二项,第二项只有前两项(第0项和第1项),没有前三项,不能用这个公式,所以题目也给出了,第0项,第1项,第2项的值,这样一步一步就可以算出数列里面各项了。

动态规划

       这样看起来也不难,但是我们在这里要学习动态规划,接下来就说说动态规划的思路

动态规划原理

       动态规划做题步骤一般我们会先定义一个dp表(一个一维数组或者一个二维数组,然后用dp来命名),然后把这个表填满,这样里面的某一个值可能我们想要的结果。

1.状态表示

2.状态转移方程

3.初始化

4.填表顺序

5.返回值

1.状态表示

       dp表里面的值表示的含义就是一个状态表示。

       状态表示简单题可以通过题目要求获取(比如这个题,状态表示就是数列里面的值)或者就是经验+题目要求(经验就是要我们多做题 一百到两百道题目),再或者分析题目发现子问题(就是把一个题目,分解成多个小问题)

       对于本题,我们可以直接根据题目要求来确定状态表示,dp表就是这个泰波那锲数列dp[i],dp[0]表示第0个泰波那锲数,dp[1]表示第1个泰波那锲数,dp[i]表示第i个泰波那锲数。最后返回第n个泰波那锲数就可以了。

这一步是做动态规划题最重要的一步!!!!!

2.状态转移方程

       状态转移方程就是:dp[i]等于什么?

       对于本题 ,dp[i]就是第i个数,根据上面普通思路的分析,第i个数等于前三个数之和,

dp[i]=dp[i-1]+dp[i-2]+dp[i-3],所以这个就是此题的状态转移方程。

这一步是做动态规划题最难的一步!!!!!

3.初始化

       初始化就是:保证填表的时候不越界,对该初始化的值要进行初始化

       对于本题,n是大于等于0的,所以小于0的都算是访问越界。状态转移方程dp[i]=dp[i-1]+dp[i-2]+dp[i-3],

       当i=0时,dp[0]=dp[-1]+dp[-2]+dp[-3]

       当i=1时,dp[1]=dp[0]+dp[-1]+dp[-2]

       当i=2时,dp[2]=dp[1]+dp[0]+dp[-1]

       可见在计算第0项,第1项,第2项时都会访问越界,所以需要初始化第0项,第1项,第2项(题目已给出值)。

4.填表顺序

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

       对于本题,加入我们要计算第3项开始算,我们需要知道,第0项,第1项,第2项,计算第4项,要知道第1项,第2项,第3项,所以要算第4项,必须先算第3项,其他依次类推,得出,填表顺序,必须是从左往右填写。

5.返回值

       根据题目要求和状态表示返回我们要的答案

       对于本题,我们要求第n个泰波那锲数的值,所以返回dp[n]就行。

代码

动态规划写代码四步

1.创建dp表

2.初始化

3.填表

4.返回值

另外这个需要注意一下,如果n=0,n=1,n=2需要单独处理。

int tribonacci(int n)
{
    //创建dp
    int dp[1000]={0};
    //初始化
    dp[0]=0;
    dp[1]=1;
    dp[2]=1;
    //边界
    if(n==0)return 0;
    if(n==1||n==2)return 1;
    //填表
    for(int i=3;i<=n;i++)
    {
        dp[i]=dp[i-1]+dp[i-2]+dp[i-3];
    }
    //返回值
    return dp[n];
}

空间复杂度:O(n)

时间复杂度:O(n)

空间优化

       某一个状态的前若干个状态,其他的没有用这种情况下可以使用滚动数组(有限的变量来代替之前的dp数组)

每次进行赋值操作,进行滚动(a=b,b=c,c=d)

int tribonacci(int n)
{
    //初始化
    int a=0,b=1,c=1,d=0;
    //边界
    if(n==0)return 0;
    if(n==1||n==2)return 1;
    while(n>2)
    {
        //计算
        d=a+b+c;
        //滚动操作
        a=b;b=c;c=d;
        n--;
    }
    return d;
}
相关文章
|
安全 Unix Linux
Docker 容器逃逸案例分析
## 0. 前言 本文参考自《Docker 容器与容器云》 这个容器逃逸的 case 存在于 Docker 1.0 之前的绝大多数版本。 目前使用 Docker 1.0 之前版本的环境几乎不存在了,这篇分析的主要目的是为了加深系统安全方面的学习。
12709 0
|
JavaScript Java Android开发
|
移动开发 JavaScript 前端开发
WebStorm 超好用的10款插件,效率提升了好多!
WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。
7208 0
WebStorm 超好用的10款插件,效率提升了好多!
|
运维 Kubernetes 数据处理
阿里云Argo X K8s玩转工作流引擎,实现大规模并行计算
Kubernetes已经成为事实的云原生操作系统,成为业务上云、容器化的标准。从过去无状态应用、企业核心应用,到现在AI时代的数据处理、AI训练、科学仿真等,越来越多的离线任务跑在K8s上。
|
存储 人工智能 关系型数据库
使用 PostgreSQL pgvector 的 AI 应用程序中的多模态搜索
大型语言模型(LLM)的发展已拓展至多模态领域,不仅能处理文本,还能解析图像。本文介绍如何构建一个多模态搜索应用,用户可通过上传图片或输入文本来搜索印度菜谱。该应用支持多种LLM服务,如OpenAI及Ollama本地部署模型,并运用pgvector扩展在PostgreSQL中高效存储和检索向量嵌入。我们还展示了如何生成菜谱描述的嵌入并向数据库写入这些嵌入,以及如何通过API接口结合文本和图像查询来获取最相关的菜谱结果。此外,讨论了使用分布式SQL数据库如YugabyteDB增强应用的可扩展性和健壮性。
787 1
|
NoSQL API 调度
【Python】轻量级分布式任务调度系统-RQ
一 前言       Redis Queue 一款轻量级的P分布式异步任务队列,基于Redis作为broker,将任务存到redis里面,然后在后台执行指定的Job。就目前而言有三套成熟的工具celery,huey ,rq 。
5439 0
|
SQL 安全 PHP
|
机器学习/深度学习 传感器 算法
基于MATLAB实现均匀平面阵MVDR算法
基于MATLAB实现均匀平面阵MVDR算法
635 0
|
前端开发 算法 Android开发
Android 架构之 MVI 完全体 | 重新审视 MVVM 之殇,PartialChange & Reducer 来拯救
Android 架构之 MVI 完全体 | 重新审视 MVVM 之殇,PartialChange & Reducer 来拯救
889 0
|
前端开发 JavaScript 网络协议
Vue中 使用 WebSocket
Vue中 使用 WebSocket
814 0
Vue中 使用 WebSocket