分析流程
三步走
1. 找到问题当中的变化量,即状态,明确dp数组/函数的定义
2. 通过第i步的选择,寻找状态之间的关系,得到转移状态方程
3. 找到base case
简化dp数组
求解动态规划的核⼼问题是穷举,最开始往是通过分析通过暴力解法得到初步思路。由于暴力解法当中有许多重复部分,故增加memo,进一步改进成迭代方法得到的。
1. 暴⼒的递归解法
2. 带备忘录memo的递归解法
3. 迭代的动态规划解法
问题分类
字符串
解决两个字符串的动态规划问题,⼀般都是⽤两个指针 i, j 分别指向两个字符串的最后,然后⼀步步往前⾛,缩⼩问题的规模。
经典问题有:编辑距离, 最大公共子串
数组/字符串的子序列
- 涉及两个字符串/数组时,dp数组的含义如 下: 在⼦数组arr1[0…i] 和⼦数组arr2[0…j]中,我们要求的⼦序列(最长公共⼦序列)长度为dp[i][j]。
- 只涉及⼀个字符串/数组时:在⼦数组 array[i…j] 中,我们要求的⼦序列(最⻓回⽂⼦序列)的⻓度 为 dp[i][j] 。
经典问题:最⻓公共⼦序列,最长回⽂⼦序列
其他问题
暴力列举,分析得到子问题的最优解,找到dp数组/函数含义。
经典问题:股票买卖,打家劫舍
参考资料
labuladong算法笔记。