一维DP
题目列表
Climbing Stairs
- Decode Ways
- Unique Binary Search Trees
- Maximum Subarray
- Maximum Product Subarray
- Best Time to Buy and Sell Stock
什么情况下可能使用DP
- 求 max/min
- yes/no 求能否达到
- count(*) 求数量
什么情况下可能不是DP
- 要求出具体方案而不是数量
- 输入的是集合而不是序列
问题描述
动态规划就是利用存储历史信息来减少重复计算,从而降低时间复杂度,用空间换时间的算法思路
动态规划的基本思路
- state,也就是dp表示的状态,确定递推量具体含义,也会定下维度
- function, 连接方程,这是最难的地方
- init, 初始化状态
- result, 最后的result是哪一个状态
常见优化:
有的时候对于历史信息的要求仅限于前面几步,就可以减少存储的空间
类型1
题目
- climbing chairs
- jump game
- decode ways
- unique binary search trees
思路
类型1比较简单,按照general思路来想,找到递推式
类型2 global, local
题目
- maximum subarray
- maximum product subarray
- best time to but and sell stock
思路
当看到一个题目,对于要求的结果可以选择包含
还是不包含
当前value[i]
时,就可以往这个方向想了
这种类型的题目要维护两个DP:
global
全局最优 (到目前为止最好的结果,不一定包含当前值)local
局部最优 (包含当前值的最优结果)
递推式: 根据local
和global
还有当前value[i]
的关系,找出他们的递推式,最终结果是看global
题目
- submatrix sum
这道题跟subarray sum类似,但是是二维的,但是如果我们将行的上下边界固定,将每一列的和当做一个元素的话,就和array的问题类似。
!pic