听代码随想录-动态规划基础总结
常见基础题型
基础题目(斐波那契、爬楼梯...)
背包问题
打家劫舍
股票问题
子序列问题(编辑距离问题也是)
学习误区
...就是下面这部分理解难
动归五部曲
dp数组
递推公式
dp数组如何初始化
遍历顺序
打印数组
所有动态规划就按照这个想就对了
以一个简单入门题:斐波那契数为例:509. 斐波那契数 - 力扣(LeetCode)
第一步:确定dpi含义(以及下标i含义)
下标i:次序
dpi:第i个斐波那契数
第二步:递推公式
dpi = dpi - 1 + dpi - 2
第三步:dp数组如何初始化
这道题给的很清晰了:dp0 = 1 、dp1 = 1
第四步:遍历顺序
这道题是从前到后遍历
但不代表所有题型都是
有的题目是从前到后遍历
有的题目是从后往前遍历
有的题目是两层for循环遍历
有的题目的两层for循环遍历先后顺序是有说法的
第五步:打印dp数组
(起到DeBug作用)看与我们想象中的数组是否一样
连答案都不用看,按上面思路都写出来了:(除了两个边界漏了)
java
class Solution {
public int fib(int n) {
//1.
int[] dp = new int[n];
if(n == 0){return 0;}
if(n == 1 || n == 2){return 1;}
//3.
dp[0] = 1;
dp[1] = 1;
//4.
for(int i = 2 ; i < n ; i ++){
//2.
dp[i] = dp[i - 1] + dp[i - 2];
}
//5.
return dp[n-1];
}
}
