动态规划的本质是:递归
解题思路:将原问题拆分成若干个子问题,解决子问题后再返回原问题,依靠子问题的解来解决原问题。
问题共性
- 题目中包含最大、最小、最优、最长、计数
- 离散问题
- 最优子结构,都能由N-1推导出N
动态规划需要解决的两大问题:
最优子结构
- 通过子问题(n-1)最优决策导出原问题(n)最优决策
- 无后效性(有后效性指对n进行操作后会影响对n-1,n-2的操作),本身递归是有后效性的,但是利用动态规划可以跳过使每一次操作无后效性
重叠子问题
- 去冗余
- 空间换时间(用数组存储需要冗余计算的值,避免重复计算)
动态规划步骤:
- 用暴力算法(例如递归),并找到冗余(需要重复计算的值)
- 存储冗余的状态,用一维、多维数组或者map
- 把递归式设计成状态转移方程
- 自底向上(递推)、自顶向下(递归)计算最优解
- 自底向上时要注意输入为空、或输入为前几个值的情况;自顶向下要注意边界(如数组边界)