动态规划(1. 第 N 个泰波那契数)
题目链接:第 N 个泰波那契数
解法(动态规划):
算法流程:
- 1.状态表示:
怎么来?
====== 题目经验 经验+题目要求 分析问题的过程中发现重复子问题 ========
这道题可以「根据题⽬的要求」直接定义出状态表示:dp[i] 表示:第 i 个泰波那契数的值。
- 2. 状态转移方程:
======= dp[i]等于什么 =============
题目已经非常贴心的告诉我们了: dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3]
- 3. 初始化:
======= 保证填表不越界 =============
从我们的递推公式可以看出, dp[i] 在 i = 0 以及 i = 1 的时候是没有办法进⾏推导的,因为 dp[-2] 或 dp[-1] 不是⼀个有效的数据。因此我们需要在填表之前,将 0, 1, 2 位置的值初始化。题⽬中已经告诉我们 dp[0] = 0, dp[1] = dp[2] = 1 。
- 4. 填表顺序:
=========== 填写当前状态时,所需状态已经填过了 ============
毫⽆疑问是「从左往右」。
- 5. 返回值:
========= 题目要求+状态表示 ============
应该返回 dp[n] 的值。
代码:
C++
java:
空间优化:
由于现在主要学习使用动态规划,因此只是在这里提一下空间优化,后面三四十道题都不会讲,到后面背包问题再讲。
这里使用滚动数组进行优化
能使空间复杂度
代码:
C++:
java: