DP的一点总结
DP拥有以下两点特征(必要条件):
- 最优子结构:问题的最优解包含了子问题的最优解。贪心算法和分治法同样具有此特征
- 重叠子问题:解原问题的递归算法可反复地解同样的子问题,而不是总在产生新的子问题。分治法不同,它在递归的每一步都产生全新的子问题
Tips: DP通常应用于最优化问题,即此类问题可能有很多种可行解,而我们希望找出一个具有最优值的解
DP大致有四个步骤:
- 分析问题,确定是否具有最优子结构,这是使用DP的必要条件
- 找出问题最优解与子问题最优解的递归关系,给出递归式(最关键一步)
- 利用递归关系转换为非递归的算法,以自底向上的方式计算最优解的值(不直接使用递归是为了降低算法的时间复杂度)
- 由计算结果构造一个最优解(非必须)
DP的一个特点是子问题不独立(与分治法不同),即你可以把分治法看成是解决并列的子问题,然后合并;而DP是一层一层嵌套的子问题。采用DP时,对每个子问题只求解一次,将其结果保存在表格中,从而在之后的计算中直接使用而不必重复求解子问题
DP有一种变形,叫备忘录,即在使用递归而非自底向上的同时,维护一张表保存子问题的解。初始化阶段,表内所有项均包含一个特殊值,表示该项有待填入。当在递归执行时遇到子问题后进行查表,若该项待填,则计算子问题的解。以后每次遇到该子问题时,只需在表中查询先前填入的值即可
备忘录算法同样利用了重叠子问题这一特征,对每个子问题只求解一次
装配线调度问题
问题