动态规划
动态规划算法和分治法基本思想类似,但又有不同之处。它适用于求解最优化问题。
基本思想
动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划法求解的问题,经分解得到的子问题往往不是互相独立的。
注:这类问题一般也能用分治法求解,但因为有些子问题被重复计算多次,导致效率不高,不推荐使用。
基本要素
动态规划算法的有效性依赖于问题本身所具有的两个重要性质:最优子结构性质和子问题重叠性质。从一般意义上讲,问题所具有的这两个重要性质是该问题可用动态规划算法求解的基本要素。
最优子结构
当问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质。(在分析问题是否具有最优子结构性质时,所用的方法具有普遍性:首先假设由问题的最优解导出的子问题的解不是最优的,然后再设法说明在这个假设下可构造出比原问题最优解更好的解,从而导致矛盾。)
利用问题的最优子结构性质,以自底向上的方式递归地从子问题的最优解逐步构造出整个问题的最优解。最优子结构是问题能用动态规划算法求解的前提。
重叠子问题
递归算法求解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。这种性质称为子问题的重叠性质。
动态规划算法,对每一个子问题只解一次,而后将其解保存在一个表格中,当再次需要解此子问题时,只是简单地用常数时间查看一下结果。通常不同的子问题个数随问题的大小呈多项式增长。因此用动态规划算法只需要多项式时间,从而获得较高的解题效率。
基本步骤
动态规划算法适用于求解最优化问题,通常可按以下4个步骤设计:
- 找出最优解的性质,并刻划其结构特征。(分析最优解的结构)
- 递归地定义最优值。(写出状态转移方程,即建立递推关系)
- 以自底向上的方式计算出最优值。(计算最优值)
- 根据计算最优值时得到的信息,构造最优解。(构造最优解)
注:求解动态规划问题的关键,就是寻找一个好的状态(dp[i]、dp[i][j])。
动态规划算法的变形
备忘录方法时动态规划算法的变形。
与动态规划算法一样,备忘录方法用表格保存已解决的子问题的答案,在下次需要解此问题时,只要简单地查看该子问题的解答,而不必重新计算。
与动态规划算法不同的是,备忘录方法的递归方式是自顶向下的(备忘录方法的控制结构与直接递归方法的控制结构相同),而动态规划算法则是自底向上递归的。