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

【动态规划】-- 第N个泰波拉契数

文章目录

  • 1. 题目
  • 2. 题目解析
  • 3. 代码

1. 题目

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

提示:

  • 0 <= n <= 37
  • 答案保证是一个 32 位整数,即 answer <= 2^31 - 1

2. 题目解析

1. 状态表示

动态规划的一般流程:创建一个一维的或者二维的dp表,然后想办法将dp表填满,填满之后,dp表中的某一个值可能就是最终结果。

【状态表示是什么?】:其中状态表示就是dp表中的某一个位置的值所代表的含义。其中这个含义就是状态表示。

【怎么确定状态表示?】

  1. 题目要求
  2. 经验 + 题目要求
  3. 分析问题的过程中,发现重复子问题

本题的状态表示是直接根据题目要求所得的。
dp[i] 表示 : 第 i 个泰波拉契数的值
2. 状态转移方程
【什么是状态转移方程?】
dp[ i ] 等于什么,什么就是状态转移方程。


本题的状态转移方程:dp[ i ] = dp[ i - 1 ] + dp[ i - 2 ] + dp[ i - 3 ]

3. 初始化
根据状态转移方程填表时,保证填表的时候不越界。
在这里插入图片描述
根据上面我的根据题意得出的状态转移方程,在填0位置的dp表时,会出现dp[ - 1 ]、dp[ - 2 ]、dp[ - 3 ],此时就会越界, 同理,在填1位置和2位置时也会出现越界的问题。

所以, 初始化dp[ 0 ] = 0、dp[ 1 ] = dp[ 2 ] = 1。

4. 填表顺序
为了填写当前状态的时候所需要的状态已经计算过了。

所以,这道题的填表顺序是:从左往右。

5. 返回值
结合题目要求 + 题目要求。

所以,这道题的返回值是dp[ n ]

3. 代码

class Solution {
    public int tribonacci(int n) {
        //处理一下边界情况
        if (n == 0){
            return 0;
        }
        if (n == 2 || n == 1){
            return 1;
        }

        //1. 创建一个dp表
        int[] dp = new int[n + 1];
        //2. 初始化
        dp[0] = 0;
        dp[1] = dp[2] = 1;
        //3. 填表
        for (int i = 3; i < dp.length; i++) {
            dp[i] = dp[i - 3] + dp[i -2] + dp[i - 1];
        }
        //4. 返回值
        return dp[n];
    }
}

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

空间优化
动态规划 的空间优化一般都是使用滚动数组。

【分析】:在求n位置的状态时,只需要该位置前三个的状态表示,那么其余的前面的状态表示都是多余的。

在填写dp表时,仅需要所求状态的前面的部分状态表示,这样的都可以使用滚动数组来进行空间优化。
使用滚动数组来优化空间的结果:0(N^2)—> 0(N), 0(N)—> 0(1).
在这里插入图片描述

class Solution {
    public int tribonacci(int n) {

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

        int a = 0;
        int b = 1;
        int c = 1;
        int d = 0;
        for (int i = 3; i <= n ; i++) {
            d = a + b + c;
            a = b;
            b = c;
            c = d;
        }
        //4. 返回值
        return d;
    }
}
原文地址:https://blog.csdn.net/2303_80341387/article/details/146484103
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/600581.html

相关文章:

  • Redmi Note 11 T pro + 刷入 LinegaOs 22.1 记录 手机已经解锁bl.
  • 基于web的家政服务网站
  • 记一次线上程序宕机问题分析【写 GC 日志导致进程挂起】
  • 【Linux线程】——线程同步线程互斥
  • Doris通过时间字段,按照周分组统计的sql
  • 23种设计模式-解释器(Interpreter)设计模式
  • 响应式 Web 设计:HTML 与 CSS 协同学习的进度(二)
  • 基于Logisim的汉字显示模拟实验
  • pikachu靶场实战记录
  • 目标检测20年(二)
  • uv包简单使用案例
  • MySQL - 索引【index】
  • 如何设计系统扩展性以应对业务增长
  • SAP-ABAP:SAP数据集成全场景技术指南(BAPI、RFC、IDOC、BATCHJOB、ODATA、WEBSERVICE):从实时交互到批量处理
  • Linux 练习二 LVS的NAT模式
  • 城电科技|景观光伏花 太阳能发电的景观光伏太阳花向日葵
  • 《Operating System Concepts》阅读笔记:p481-p482
  • 搭建k8s集群的可观测体系(log和metric)(已踩完坑)
  • [每周一更]-(第137期):Go + Gin 实战:Docker Compose + Apache 反向代理全流程
  • 【Tauri2】003——run函数的简单介绍(1)