动态规划| 【斐波那契数列模型 】|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;
}
相关文章
|
Ubuntu Linux 网络安全
【ubuntu】MobaXtem远程登录ubuntu系统(或虚拟机)
【ubuntu】MobaXtem远程登录ubuntu系统(或虚拟机)
|
4月前
|
存储 人工智能 数据可视化
最新版:阿里云万小智 AI 建站服务配置与价格说明
阿里云万小智 AI 建站是基于通义大模型开发的一站式建站服务,集成云服务器、存储、CDN 等基础资源,无需专业开发知识即可完成网站搭建。本文详细梳理其不同版本的功能配置、资源规格及收费标准,为用户选择合适的建站方案提供参考。
|
9月前
|
人工智能 前端开发 机器人
10+热门 AI Agent 框架深度解析:谁更适合你的项目?
一个合适的 Agent 框架,决定了你AI应用落地的速度与质量。选框架 ≠ 选最火! 真正能跑起来、跑得稳、跑得远的 Agent 框架,才是你的最优解。
|
8月前
|
存储 虚拟化 数据中心
VMware ESXi 9.0 macOS Unlocker & OEM BIOS 2.7 HPE 慧与 定制版
VMware ESXi 9.0 macOS Unlocker & OEM BIOS 2.7 HPE 慧与 定制版
387 0
|
机器学习/深度学习 存储 人工智能
强化学习与深度强化学习:深入解析与代码实现
本书《强化学习与深度强化学习:深入解析与代码实现》系统地介绍了强化学习的基本概念、经典算法及其在深度学习框架下的应用。从强化学习的基础理论出发,逐步深入到Q学习、SARSA等经典算法,再到DQN、Actor-Critic等深度强化学习方法,结合Python代码示例,帮助读者理解并实践这些先进的算法。书中还探讨了强化学习在无人驾驶、游戏AI等领域的应用及面临的挑战,为读者提供了丰富的理论知识和实战经验。
840 5
|
监控 数据可视化 项目管理
高效时间管理工具如何帮助优化日常任务管理?2024年6款最优秀软件
在快节奏的现代工作环境中,高效的时间管理和任务协作工具成为提升生产力的关键。2024年,随着工作模式的变化,企业及个人愈发依赖这些工具来优化时间管理、任务分配和团队协作。本文精选了几款高效工具,如板栗看板、ClickUp、Notion、Wrike、Todoist和Evernote,它们各自具备独特优势,适用于不同行业和规模的团队,帮助用户在繁忙的工作中保持高效和有序。
2167 6
高效时间管理工具如何帮助优化日常任务管理?2024年6款最优秀软件
|
移动开发 jenkins 持续交付
解决jenkins、git拉取代码仓库失败Please make sure you have the correct access rights
解决jenkins、git拉取代码仓库失败Please make sure you have the correct access rights
681 3
|
JSON API 数据安全/隐私保护
闲鱼商品详情API:深入解析与应用指南
闲鱼商品详情API助力提升交易体验,提供商品全貌,包括价格、描述、图片等实时信息,增强买卖双方信任。开发者可通过接口获取商品基本信息、描述、图片、分类等,用于构建推荐、比价系统。接口调用示例展示了如何获取商品数据,如价格、位置、卖家信息等,以JSON格式返回,便于集成到应用中,促进高效交易。
|
存储 人工智能 关系型数据库
使用 PostgreSQL pgvector 的 AI 应用程序中的多模态搜索
大型语言模型(LLM)的发展已拓展至多模态领域,不仅能处理文本,还能解析图像。本文介绍如何构建一个多模态搜索应用,用户可通过上传图片或输入文本来搜索印度菜谱。该应用支持多种LLM服务,如OpenAI及Ollama本地部署模型,并运用pgvector扩展在PostgreSQL中高效存储和检索向量嵌入。我们还展示了如何生成菜谱描述的嵌入并向数据库写入这些嵌入,以及如何通过API接口结合文本和图像查询来获取最相关的菜谱结果。此外,讨论了使用分布式SQL数据库如YugabyteDB增强应用的可扩展性和健壮性。
686 1
|
网络协议 网络安全
SPI 机制
SPI 机制
477 0