1137. 第 N 个泰波那契数【动态规划】

1137. 第 N 个泰波那契数

1137. 第 N 个泰波那契数

泰波那契序列 T n T_n Tn 定义如下:

T 0 = 0 , T 1 = 1 , T 2 = 1 , T_0 = 0, T_1 = 1, T_2 = 1, T0=0,T1=1,T2=1, 且在 n > = 0 n >= 0 n>=0 的条件下 T n + 3 = T n + T n + 1 + T n + 2 T_{n+3} = T_n + T_{n+1} + T_{n+2} Tn+3=Tn+Tn+1+Tn+2

给你整数 n n n,请返回第 n n n 个泰波那契数 T n T_n Tn 的值。

示例 1:

输入:n = 4
输出:4
解释 T 3 = 0 + 1 + 1 = 2 T_3 = 0 + 1 + 1 = 2 T3=0+1+1=2
T 4 = 1 + 1 + 2 = 4 T_4 = 1 + 1 + 2 = 4 T4=1+1+2=4

示例 2:

输入:n = 25
输出:1389537

提示:

  • 0 <= n <= 37
  • 答案保证是一个 32 位整数,即 a n s w e r < = 2 31 − 1 answer <= 2^{31} - 1 answer<=2311

解题思路

斐波那契数列是动态规划入门题,而泰波那契数斐波那契数其实是一样的道理,不过是前三个数相加罢了,所以同样可以用动态规划解决。

Go代码

func tribonacci(n int) int {
    if n == 0 {
        return 0
    }
    if n == 1 || n == 2 {
        return 1
    }
    dp := make([]int,n+1)
    dp[0] = 0
    dp[1] = 1
    dp[2] = 1
    for i := 3;i <= n; i++ {
        dp[i] = dp[i-3] + dp[i-2] + dp[i-1]
    }

    return dp[n]
}

在这里插入图片描述

<think>好的,我现在需要帮助用户解决如何用动态规划计算第n个泰波的问题。首先,我得回忆一下泰波的定义。根据引用[1],泰波是当前项等于前三项之和,这和斐波那不同,斐波那是前两项之和,如引用[2]提到的。用户可能需要的是类似斐波那动态规划解法,但扩展到三项。用户明确要求动态规划的方法,所以我需要先考虑动态规划的基本思路。动态规划通常包括状态定义、转移方程、初始化和空间优化。泰波的状态转移方程应该是T(n)= T(n-1)+ T(n-2)+ T(n-3),初始条件可能如引用[1]中的解法一所示,当n=0时返回0,n=1或2返回1。这应该作为初始状态。 接下来,考虑动态规划的迭代方式。递归方法虽然直观,但会有重复计算的问题,如引用[3]中的记忆化递归解法,通过缓存来优化。但动态规划一般更倾向于迭代方式,自底向上计算,避免递归的开销。所以应该用组或几个变量来保存前三项的值,逐步计算到n。然后,我需要确定代码结构。对于动态规划,通常会用组dp来存储中间结果。初始条件设置dp[0]=0,dp[1]=1,dp[2]=1,然后从3循环到n,每一步计算dp[i] =dp[i-1] +dp[i-2] +dp[i-3]。这样时间复杂度是O(n),空间复杂度如果只保存前三个值的话可以优化到O(1),但用户可能希望先看到标准的动态规划实现,之后再优化空间。 另外,引用[4]提到转移方程的矩阵展开,这可能涉及到更高级的矩阵快速幂方法,时间复杂度可以降到O(logn),但用户可能暂时不需要这么复杂的解法,先提供基础的动态规划实现更合适。然后,测试一下边界情况,比如n=0、1、2的情况,确保代码正确处理。例如,当n=0时返回0,n=1或2返回1,这些初始条件是否正确。最后,编写代码示例,使用Python语言,因为用户提供的引用中有Python和Java的例子,但用户的问题没有指定语言,可能更倾向于Python。同时,解释代码的每一步,让用户理解动态规划的过程。可能还需要讨论时间复杂度和空间复杂度,以及可能的优化方法,比如空间优化到O(1)。总结步骤: 1.定义状态转移方程和初始条件。2.使用组存储中间结果,迭代计算。 3.处理边界条件。4.编写代码并解释。 5.分析时间空间复杂度,提出优化方向。</think>### 动态规划实现泰波 泰波列定义为:$T_0 = 0$, $T_1 = 1$, $T_2 = 1$, 且当 $n \geq 3$ 时,$T(n) = T(n-1) + T(n-2) + T(n-3)$[^1]。动态规划通过存储中间结果避免重复计算,时间复杂度为 $O(n)$,空间复杂度可优化至 $O(1)$。 #### 实现步骤 1. **状态定义**:用组 `dp` 存储 $T(0)$ 到 $T(n)$ 的值 2. **转移方程**:$dp[i] = dp[i-1] + dp[i-2] + dp[i-3]$ 3. **边界条件**:$dp[0] = 0$, $dp[1] = dp[2] = 1$ 4. **空间优化**:仅保留前三个值(滚动变量) #### Python 代码实现 ```python def tribonacci(n: int) -> int: if n == 0: return 0 if n <= 2: return 1 # 初始化前三项 a, b, c = 0, 1, 1 # T0, T1, T2 for _ in range(3, n+1): next_val = a + b + c a, b, c = b, c, next_val # 滚动更新 return c ``` #### 代码解析 - **时间复杂度**:$O(n)$,仅需遍历一次 - **空间复杂度**:$O(1)$,仅用三个变量存储状态 - **边界处理**:直接返回 $n=0,1,2$ 的预定义值 - **滚动更新**:通过变量重赋值替代组,降低空间占用[^3] #### 矩阵快速幂优化(进阶) 引用[^4]中的矩阵展开方法可将时间复杂度优化至 $O(\log n)$,适用于极大 $n$ 的场景。其核心是通过矩阵幂运算加速递推: $$ \begin{bmatrix} T(n) \\ T(n-1) \\ T(n-2) \end{bmatrix} = \begin{bmatrix} 1 & 1 & 1 \\ 1 & 0 & 0 \\ 0 & 1 & 0 \end{bmatrix}^{n-2} \begin{bmatrix} T(2) \\ T(1) \\ T(0) \end{bmatrix} $$
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值