- 引言
早上起来,看了一道美团面试题,是关于动态规划的。突然发现对学过的算法并没有一个系统全面的认识。于是准备把经典算法以写博客的形式回顾一遍。贵在坚持!
- 理解
如果问题是由交叠的子问题构成的,我们就可以运用动态规划技术来解决它。一般来说,这样的子问题出现在对给定问题求解的递推关系中,这个递推关系中包含了相同类型的更小子问题的解。动态规划法建议,与其对交叠的子问题一次又一次的求解,还不如对所有的子问题只求解一次,并把结果保存在一张表中,这样就可以从表中得到原始问题的解。
能用动态规划法解决的问题的特点:具有最优子结构性质和无后效性
最优子结构性质:问题的最优解所包含的子问题的解也是最优的
无后效性:无后效性是指如果在某个阶段上过程的状态已知,则从此阶段以后过程的发展变化仅与此阶段的状态有关,而与过程在此阶段以前的阶段所经历过的状态无关。利用动态规划方法求解多阶段决策过程问题,过程的状态必须具备无后效性。
思路就是:首先分析问题,是否可以划分为更小的子问题,即分析问题是否有最优子结构性质和无后效性,然后推导出问题的递归函数表达式,设计伪代码,求解问题。
- 典型例子
- 币值最大化问题
- 找零问题
- 硬币收集问题