@TOC
先说一下动态规划斐波拉契数列模型的解决常见办法:
这类问题常见的解法就是以 i 位置为结尾,然后按照题目的题解总结状态转移方程,在进行基础的初始化,通过已有数据,推导出未来某一时刻的相关数据。总结如下:
1. 状态表示
2. 状态转移方程
3. 初始化
4. 填表顺序
5. 返回值
接下来通过几个题来进行讲解:
第N个泰波那契数
这是动态规划最基础的一道题
链接 : . - 力扣(LeetCode)
代码讲解:
按照我们上面说的步骤来进行讲解:
状态表示:
这个题我们就是创建一个dp数组,每一个状态就是以i 为结尾的dp[i]
状态转移方程:
这个题的状态转移方程, 题目已经是给我们说明了 dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3];
初始化
题目上面的也是有提到 dp[0] = 0, dp[1] = 1, dp[2] = 1
填表顺序
我们要知道第n个泰波那契数, 就必须知道n - 1, n - 2, n - 3, 依次类推, 顺序是从左往右逐渐推导
返回值
我们需要的是第n个泰波那契数, 那么返回值自然是dp[n];
代码展示:
class Solution {
public:
int tribonacci(int n) {
if(n == 0)
{
return 0;
}
if(n == 1 || n == 2)
{
return 1;
}
vector<int> dp(n + 1);
dp[0] = 0, dp[1] = 1, dp[2] = 1;
for(int i = 3; i <= n; i++)
{
dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3];
}
return dp[n];
}
};
三步问题
链接 : . - 力扣(LeetCode)
代码讲解:
状态表示:
这个题我们