1.题目链表:
泰波那契序列 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
3. 解法(动态规划)
算法流程
1. 状态表示:
这道题可以「根据题目的要求」直接定义出状态表示:dp[i] 表示:第 i 个泰波那契数的值。
2. 状态转移方程:
题目已经非常贴心的告诉我们了:
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] 的值。
Java算法代码:
class Solution {
public int tribonacci(int n) {
// 空间优化
// 处理边界情况
if(n == 0) return 0;
if(n ==1 || n==2) return 1;
int a = 0,b=1,c=1,d=0;
for(int i = 3;i <=n;i++){
d = a + b + c;
a = b; b=c; c=d;
}
return d;
}
}
运行结果:
动态规划: 这道题目给定很多,状态的定义dp[i],以及状态转移方程dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3],初始化dp[0] = 0,dp[1] = dp[2] = 1 。填表顺序(左 --> 右,以及返回值dp[n]。
---------------------------------------------------------------------------------------------------------------------------------
记住要做的几件事:
1.状态定义
2.状态转移方程
3.初始化
4.填表顺序
5.返回值