【动态规划】是泰波那契数,不是斐波那契数

本文解析了第N个泰波那契数问题,介绍了动态规划解法,包括状态表示、状态转移方程、初始化和边界处理,以及迭代优化方法以降低空间复杂度。同时讨论了两种方法的时间和空间复杂度。

在这里插入图片描述

在这里插入图片描述

Problem: 1137. 第 N 个泰波那契数

题目解读

首先我们来解读一下本题的意思🔍

1.jpg

  • 相信读者在看到【泰波那契数】的时候,不禁会联想到【斐波那契数】,它们呢是一对孪生兄弟,这个 泰波那契数 相当于是 斐波那契数 的加强版
  • 我们首先可以来看到这个递推公式Tn+3 = Tn + Tn+1 + Tn+2,读者可能看不太懂,我们将其做一个转换为Tn = Tn-1 + Tn-2 + Tn-3,即把所有n都统一-3那么第N个泰波那契数就等于前面3个泰波那契数的和

2.jpg

  • 看到上面的T3,就是前3个数的和等于2,以此类推T4就是T1 + T2 + T3 = 4

解题方法

看完了上面对于题目的分析之后,下面我将介绍两种解法

dp动态规划

首先的话就是本题需要掌握的重点即【动态规划】的解法,我们要分成五步去求解

  1. 状态表示
  • 首先读者要清楚的是在求解动态规划的题目时,都是需要一个dp数组的,那么对于【状态表示】的含义就是dp表里的值所表示的含义

3.jpg

那这个状态表示是怎么来的呢?

① 第一个呢就是按照题目要求来,dp[i]表示的就是第i个泰波那契数列的值

② 第二个呢则是需要读者有丰富的刷题经验,可以读完题目之后就得出对应的结果

③ 第三个呢则是在分析问题的过程中,发现重复的子问题

如果读者之前有接触过类似的动态规划问题的话,就会看到一些题解里讲:这道题的 状态表示 是怎样的,然后就直接讲本题的 状态表示方程,根本没有说这道题的状态表示是怎么来的。这个得来的过程我会在其他动态规划的题目中进行讲解

👉 所以读者在解类似的问题时一定要知道下面的这个【状态表示方程】是怎么来的,做到 “ 知其然,知其所以然 ”


  1. 状态表示方程
  • 那么本题的状态表示方程为dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3]
  1. 初始化
  • 在清楚【状态表示方程】该如何写之后,我们要去做的就是对这个dp数组做一个初始化的工作。看到下面的这个dp数组,如果在一开始我们的下标取值就到0的话,那么i - 1i - 2i - 3这些就会造成 越界

4.jpg

  • 因此我们要给这个dp数组去做一个初始化,具体的就是对前三个数据即dp[0]dp[1]dp[2]分别初始化为【0】【1】【1】,那我们在后面遍历计算的时候就只需要从下标为3的位置开始即可
 dp[0] = 0, dp[1] = dp[2] = 1;
  1. 填表顺序
  • 接下去的话就是把dp数组按照 状态表示方程 给填充好即可
for(int i =
<think>嗯,用户想找关于泰波列用C语言实现的递推代码或者教程。首先,我需要回顾一下泰波列的定义。根据引用[2]引用[3],泰波列的前三项是T0=0,T1=1,T2=1,之后每一项都是前三项之。这类似于斐波那契列,但多了一个项。 用户可能已经了解斐波那契列的递推方法,所以需要将这种知识迁移到泰波列上。斐波那契列通常用组来存储前两项,然后循环计算后面的项。而泰波列则需要初始化三个初始值,并在循环中每次累加前三个。 接下来,我需要检查用户提供的引用内容中的代码示例。引用[2]中的代码有一个错误,在循环中F[i] = F[i - 1] = F[i - 2] + F[i - 3]; 这显然不正确,应该是F[i] = F[i-1] + F[i-2] + F[i-3]。而引用[3]中的代码是正确的,正确初始化了前三项,并且循环计算每一项。 因此,正确的代码应该像引用[3]中的示例那样,定义组,初始化前三项,然后从i=3开始循环到n,每次计算当前项为前三项之。需要注意组的大小是否足够,比如当n较大时,组可能会越界。用户可能需要处理n较大的情况,但根据引用中的例子,可能暂时假设n不会超过组大小。 用户可能还需要了解代码的每个步骤,所以需要在解释时详细说明每个部分的作用,比如组的定义、初始化、循环结构以及返回结果。此外,还需要指出可能的错误点,比如组索引是否正确,循环起始点是否正确。 另外,用户可能想知道时间复杂度空间复杂度。递推方法的时间复杂度是O(n),空间复杂度也是O(n),但如果使用变量代替组存储前三个值,可以优化到O(1)空间复杂度。不过根据用户的需求,可能更关注递推实现,所以暂时提供组版本。 最后,生成相关问题需要考虑用户可能的后续疑问,比如优化方法、不同语言的实现、性能比较或者应用场景,这样可以帮助用户更深入地理解泰波列的实现应用。</think>### 泰波列的C语言递推实现 #### 一、泰波列定义 泰波列 $T_n$ 的定义如下: $$ \begin{cases} T(0) = 0, \\ T(1) = 1, \\ T(2) = 1, \\ T(n) = T(n-1) + T(n-2) + T(n-3) & (n \geq 3) \end{cases} $$ #### 二、递推实现思路 1. **初始化前三个**:根据定义设置 $T[0]=0$, $T[1]=1$, $T[2]=1$[^2][^3] 2. **循环计算后续项**:从 $i=3$ 开始,通过公式 $T[i] = T[i-1] + T[i-2] + T[i-3]$ 递推计算 3. **返回结果**:直接返回组的第 $n$ 项 #### 三、完整C语言代码 ```c int tribonacci(int n) { int T[100]; // (1) 定义组存储结果 T[0] = 0; // (2) 初始化前三项 T[1] = 1; T[2] = 1; for(int i = 3; i <= n; ++i) { // (3) 递推计算后续项 T[i] = T[i-1] + T[i-2] + T[i-3]; // (4) 核心递推公式 } return T[n]; // (5) 返回结果 } ``` #### 四、代码解析 | 代码段 | 说明 | |-------|------| | `(1)` | 定义足够大的组(假设n≤99)| | `(2)` | 初始化前三个已知项 | | `(3)` | 从第4项开始循环计算 | | `(4)` | 递推公式实现三相加 | | `(5)` | 返回目标项值 | #### 五、时间复杂度分析 - **时间复杂度**:$O(n)$,仅需单层循环 - **空间复杂度**:$O(n)$,使用组存储结果[^3] #### 六、优化建议 1. **滚动变量法**:只需保存前三个值,可将空间复杂度优化为 $O(1)$ 2. **边界处理**:增加对 $n<0$ 的输入校验 3. **动态组**:使用动态内存分配处理大值情况
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烽起黎明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值