算法日常・每日刷题--<动态规划>1

1137. 第 N 个泰波那契数 - 力扣(LeetCode)1137. 第 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 = 2T_4 = 1 + 1 + 2 = 4示例 2:输入:n = 25输出:1389537 提示: * 0 <= n <= 37 * 答案保证是一个 32 位整数,即 answer <= 2^31 - 1。https://leetcode.cn/problems/n-th-tribonacci-number/

题目简介

泰波那契序列 Tₙ 定义:

  • T₀ = 0,T₁ = 1,T₂ = 1
  • n ≥ 3 时,Tₙ = Tₙ₋₁ + Tₙ₋₂ + Tₙ₋₃

给定整数 n,返回第 n 个泰波那契数。

泰波那契数可以理解为三项版斐波那契数列,是动态规划非常经典的入门练习题。

动态规划五步

做 DP 题我习惯按这五步思考,不容易漏条件:

  1. dp 数组含义 :dp[i] 表示第 i 个泰波那契数的值
  2. 状态转移方程 :dp[i] = dp[i-1] + dp[i-2] + dp[i-3]
  3. dp 数组初始化 :dp[0]=0,dp[1]=1,dp[2]=1
  4. 遍历顺序:从小到大正向遍历,后面的值依赖前面已经计算完成的值
  5. 返回结果 :dp[n]
cpp 复制代码
class Solution {
public:
    int tribonacci(int n) {
        // 定义dp[],有关dp[]的方程,初始化,从哪个方向开始填,返回值
        if(n == 0) return 0;
        if(n == 1 || n == 2) return 1;
        
        vector<int> dp(n + 1);
        dp[0] = 0;
        dp[1] = 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];
    }
};

我们还可以在此基础上添加对于空间上的优化

因为实际上用的dpi的求值只与前面三个有关,就不需要存储那么多;

相关推荐
晚安code1 小时前
JVM 内存结构入门:程序计数器、虚拟机栈、本地方法栈与堆的溢出诊断
java·jvm
shehuiyuelaiyuehao1 小时前
算法54,链表 两数相加
数据结构·算法·链表
自强的小白1 小时前
Spring事务失效的场景
java·spring
小蒜学长1 小时前
基于SpringBoot+Vue的小学数学智能出题系统(代码+数据库+LW)
java·数据库·spring boot·后端·智能出题系统
不灭的黄金瞳1231 小时前
Java继承与多态
java·intellij-idea
Logic1012 小时前
C语言/数据结构位运算题解:异或XOR找出弹子游戏机中数量为奇数的数字——只出现奇数次
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
147API2 小时前
如何设计“回答、追问、停答”三类蒸馏训练集
人工智能·算法·机器学习
企业数字化笔记2 小时前
视频字幕如何烧录到成片?硬字幕、软字幕、样式控制与播放验收
java·ffmpeg
朝朝辞暮i2 小时前
C++ 第7课 while 循环
开发语言·c++·算法