1137. 第 N 个泰波那契数 - 力扣(LeetCode)
一.dp表
首先,我们需要写一个dp表,然后把这个dp表填满,这个dp表的的某一个值的状态就是我们要求的结果。
二.状态表示
状态表示怎么来的,一般三个点:
这道题我们直接从题目中就可以获取状态表示,首先,dp[1]就是第一个泰波那契数,dp[2]就第二个泰波那契数 dp[i]就是第i个泰波那契数
三.转移方程
我们根据题目要求,列出转移方程 dp[i]=dp[i-1]+dp[i-2]+dp[i-3]
题目要求我们返回第n个泰波那契数, 那我们的最终return dp[n]
四.初始化
初始化有两个目的:
填表
防止越界
六.填表顺序
填表顺序目的:填当前位置时前面的位置已经被填过了
比如我想填4这个位置的值,但是3没与被填,那我4就求不了,必须先把3这个位置填了我4的位置才能填,因此我们这道题的填表顺序时从左到右。
七.边界问题
泰波那契数最少要求有3个数,所以如果n小于3需要特殊处理一下:
if(n==0)return 0;
if(n==1||n==2)return 1;
code
public:
int tribonacci(int n) {
//1.dp表
//2.初始化
//3.填表
//4.return
//边界问题
if(n==0)return 0;
if(n==1||n==2)return 1;
//1。
vector<int> dp(n+1);
//2.
dp[0]=0,dp[1]=dp[2]=1;
//3.
for(int i=3;i<=n;i++)
{
dp[i]=dp[i-1]+dp[i-2]+dp[i-3];
}
return dp[n];
}
};
空间优化
滚动数组
abcd四个变量,d=a+b+c 求完d之后整体向后挪动 再求d。
code
class Solution {
public:
int tribonacci(int n) {
//1.dp表
//2.初始化
//3.填表
//4.return
//边界问题
if(n==0)return 0;
if(n==1||n==2)return 1;
//1。
vector<int> dp(n+1);
int a=0,b=1,c=1,d=0;
//3.
for(int i=3;i<=n;i++)
{
d=a+b+c;
//滚动操作
a=b;
b=c;
c=d;
}
return d;
}
};