2动态规划步骤
1.状态表示
dp表里面的值的含义
一般有两种表示
1从起到开始到i位置的+题目要求
2从i位置到结尾+题目要求
也可能在dp[i]位置有多种状态
根据不同状态可划分f[i],g[i] 或二维数组
2状态转移方程
dp[i]等于什么
3初始化
1
处理边界情况
2加入虚拟节点
1保证在填表时,所需状态已经计算过了
2下标映射(往往题目给予除dp[j]外的如cost[j])
不一定增加节点就要映射 向右下增加节点不用管
4填表顺序
保证在填表时,所需状态已经计算过了
5返回值
题目要求+状态表示
实操
1创建dp表
2初始化
3填表
4返回值
2题目
一斐波那契数列模型
1第 N 个泰波那契数
1137. 第 N 个泰波那契数 - 力扣(LeetCode)
1.状态表示
1.dp[i]表示:+题目要求
dp[i]表示第i个泰波那契数
2状态转移方程
dp[i]等于什么
dp[i]=dp[i-1]+dp[i-2]+dp[i-3]
3初始化
处理边界情况
dp[0]=0;dp[1]=1;dp[2]=1;
4填表顺序
保证在填表时,所需状态已经计算过了从左到右
5返回值
题目要求+状态表示d[n]即题目要求
class Solution1 {
public:
int tribonacci(int n) {
//1创建dp表
vector<int> dp(n + 1);//由于要返回dp[n]的值所以创建n+1的dp表
//2初始化
//
//注意边界情况
//n==0,1,
if (n == 0)return 0;//处理边界情况时要提前return 否则后面会越界
if (n == 2 || n == 1)return 1;
dp[0] = 0;
dp[1] = 1;
dp[2] = 1;
//3填表
for (int i = 3;i <= n;i++)//注意开始条件 和结束条件 不是n==0
{
dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3];
}
//4返回值
return dp[n];
}
};
空间优化:滚动数组
当填dp表时只需要某一个状态的前几个状态
赋值方向
class Solution2 {
public:
int tribonacci(int n) {
if (n == 0)return 0;
if (n == 2 || n == 1)return 1;
int a = 0;int b = 1;int c = 1;int d = 0;
for (int i = 3;i <= n;i++)
{
d = a + b + c;
//赋值方向:左到右
a = b;b = c;c = d;
}
return d;
}
};