-
概述
-
什么是动态规划
# 算法导论 15 章 开篇 Dynamic programming, like the divide-and-conquer method, solves problems by combining the solutions to subproblems. (“Programming” in this context refers to a tabular method, not to writing computer code.) # 翻译 动态规划和分治策略类似,通过将子问题的解组合起来解决整个问题。 (这里的programming指的不是计算机的写代码,而是一种表格法,或者叫做字典法)
-
观后感
-
表格法是一种空间换时间的策略。
将需要重复求解的子问题的解记录下来,在下一次求解的时候可以直接获取。
消耗一定的内存来节省重复计算的时间开销。
-
学习之后个人觉得最难的还是根据现象来分析问题,怎样构建动态规划的最优子结构。
-
有时候问题的解法不仅仅动态规划,还有很多,可能相比下来动态规划更加的费时费力。
-
动态规划的要素只有几个,主要在于对问题进行抽象。
-
-
动态规划要素
-
最优子结构
- 整个大的问题由若干个相似结构的子问题组成。
- 也就是说动态规划是可以用递归求解的。
- 递归那么就需要列出其递归方程和状态转换。
-
重复子问题
- 分析出了最优子结构,就可以选择使用怎样的额外空间来记录求过的解。
- 一般来说是表格,也就是一个
m*n
的一个矩阵,二维数组。
-
-
获取最优子结构
-
问题的最优解需要选择比较来获取。
做选择会造成相似的子问题需要求解
-
选择的子解不需要考虑是否为最优解,直接认为它已经最优解.
会通过向下递归的方式求得子问题的最优解。
-
选择了之后的子解该怎么求,怎么用空间来存放子问题的解。
-
筛选出最优解
- 每一个选择都会有一个解,比较所有的解,选择最优的最为子问题的最优解。
- 每一个选择造成的子问题几乎都是类似的,如果有不同,可能需要做更多的工作。
-
-
重复子问题
-
重复求解
-
如果使用自上而下的求解,比如递归,那么很可能对一个问题进行重复的求解。
-
使用一定的空间对问题进行记录,在下一次使用的时候,只需要消耗
O(1)
的时间就可以得到结果。
-
-
空间选择
辅助空间越少越好,一般是
mn
,也有1
的,也有n
的,等等。-
1
的就是和最大的子数组。 -
n
的就是裁剪钢管问题。 -
mn
的是经常用到的。
-
-
-
问题转变
-
如果不存在最优子问题,只求是否有解
- 回溯
- 贪心
- 递归分治
-
如果不存在重复子问题
- 递归
-
来源:oschina
链接:https://my.oschina.net/u/3695598/blog/4334545