问题背景:刷leetcode 遇到最长回文字串问题,初看以为是变长的滑动窗口问题。尝试解决时,发现无法解决。搜索解题方法,发现大家提到了分别提到了动态规划,暴力解法,中心扩散。
各个击破,从《算法图解》开始了解动态规划,下面是看完《算法图解》动态规划章节后的总结。
目录
WHAT——是什么?目的是什么?做什么工作?
WHY——为什么要做?可不可以不做?有没有替代方案?
WHEN——何时?什么时间做?什么时机最适宜?WHERE——何处?在哪里做?
HOW ——怎么做?如何提高效率?如何实施?方法是什么?
要注意的情况
优点
WHAT——是什么?目的是什么?做什么工作?
1. 动态规划是什么
动态规划 就是将问题分解成若干个相互独立的子问题,子问题解决之后,总问题也随之解决。
2. 目的是什么
目的是解决棘手的复杂问题。比如背包问题,如果使用暴力解法,复杂度达到O(2^n),动态规划通过划分网格可以降低到O(n^2)
3. 做什么工作
将总问题划分成独立的子问题,使用网格进行指标的计算。
WHY——为什么要做?可不可以不做?有没有替代方案?
1. 为什么要做
简单来说,可以降低复杂问题的计算复杂度。
2. 可不可以不做
如果问题能够在满足条件的情况下解决,或者有更低复杂度的算法方案。
3. 有没有替代方案
具体情况具体分析。约束条件相同下的最优化问题,还可以根据数据量的不同,选择实际时间复杂度或空间复杂度更低的方法。
下文是常见例子不同解法的复杂度分析对比。动态规划 例子与复杂度
下文可以进一步理解动态规划的适用原理:
为什么你不会动态规划?
动态规划性质;以及遇到一个问题,为什么能够使用动态规划
WHEN——何时?什么时间做?什么时机最适宜?WHERE——何处?在哪里做?
when和where 的问题即为:动态规划适合在哪些状况下使用?
1. 当总问题模式是:在给定约束条件下,找到最优解。
2. 分解出来的子问题,独立且离散。
HOW ——怎么做?如何提高效率?如何实施?方法是什么?
1. 怎么做,动态规划是如何计算的
- 每种动态规划解决方案都涉及网格。网格由 坐标轴、格子值组成。
- 格子中的值通常是需要优化的目标值。
- 每个单元格都是一个子问题。如何将问题划分成子问题,有助于找到网格的坐标轴。
2. 如何提高效率——暂未研究,下面是一个简单讲解
解决如何降低动态规划算法时间复杂度
要注意的情况
- 分解出来的多个小问题,如果之间相互依赖,那么无法使用动态规划。
- 计算格子中的值时,按行或按列计算,在某些情况下,计算结果会不同。
- 只要把握一个原则,当你计算dp i的时候,一定要保证你用到的那些全部都已经被算出来了,比如区间dp,一般大区间的dp值由小区间算出来,所以你只要保证循环的时候,算每一个大区间之前,小区间都被算出来,就可以
优点
- 新加入属性时,如果属性的指标值大于等于当前细粒度,那么不必重新计算整个格子,直接添加一行进行计算即可。