动态规划基本思想
动态规划算法与分治法类似
,其基本思想也是将待求解问题分解成若干个子问题- 但是,分解得到的子问题往往
不是互相独立的
。不同子问题的数目常常只有多项式量级。 - 在用分治法求解时,有些
子问题被重复计算
了许多次。 - 如果能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,就可以避免大量重复计算,
从而得到多项式时间算法
。 - 可以
用一个表来纪录所有已解决的子问题的答案
,以后需要时,只需查询此表即可。
基本步骤
- 找出
最优解的性质
,并刻画其结构特征。 - 递归地
定义最优值
。 - 以自底向上的方式
计算最优值
。 - 根据计算最优值时得到的信息,
构造最优解
。
动态规划算法常用于求解具有某种最优性质
的问题
可能有许多可行解, 希望找到具有最优值的那个解.
动态规划算法的基本要素
两个基本要素(重要性质): 最优子结构性质
和子问题重叠性质
.
最优子结构性质
例如矩阵连乘计算次序问题的最优解包含着其子问题的最优解。这种性质称为最优子结构性质
。
分析方法: 在分析问题的最优子结构性质时,所用的方法具有普遍性:首先假设由问题的最优解导出的子问题的解不是最优的,然后再设法说明在这个假设下可构造出比原问题最优解更好的解,从而导致矛盾。
利用问题的最优子结构性质,以自底向上的方式递归地从子问题的最优解逐步构造出整个问题的最优解。最优子结构是问题能用动态规划算法求解的前提。
重叠子问题
递归算法求解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。这种性质称为子问题的重叠性质
。
动态规划算法,对每一个子问题只解一次,而后将其解保存在一个表格中
,当再次需要解此子问题时,只是简单地用常数时间查看一下结果
。
通常不同的子问题
个数随问题的大小呈多项式增长
。因此用动态规划算法只需要多项式时间,从而获得较高的解题效率。