动态规划

来源:互联网 发布:云之家网络平台 编辑:程序博客网 时间:2024/05/16 14:52

基本思想:

动态规划算法用来解决一些具有最优性质的问题,动态规划的思想和分治法相近,也是把一个问题分解为一些子问题去求解,但是动态规划处理的子问题之间会有联系。可以解决一些分治法和贪心算法解决不了的问题,其次动态规划可以提高程序运行效率避免了许多重复计算。所以下面我们给出几点动态规划的性质:

  • 最优子结构性质:
    无论之前状态结构如何,当前状态下得到的最优子结构一定是最优的。
  • 无后向性:
    以前各阶段的状态无法直接影响它未来的决策,而只能通过当前的这个状态。换句话说,每个状态都是过去历史的一个完整总结。
  • 子问题重叠性:
    使用动态规划算法过程中会保留每个状态的运行结果避免重复计算,即用空间换取时间。

算法实现:

下面我们使用一个动态规划中常用的例子——最长公共子序列来了解动态规划
算法步骤:
- 描述最优解的结构
- 递归定义最优解的值
- 按自底向上的方式计算最优解的值
- 由计算出的结果构造一个最优解
我们给出两条序列X:ABCBDABY:BDCABA,我们要找到两个字符串中最长公共子序列,注意最长公共子序列是可以是不连续的,而最长公共子串是要完整的子串。下面给出求解公式:
公式
i表示的是X中第i个位置,j表示的是Y中第j个位置,矩阵c[i,j]中存储当序列为x0,x1…xi和y0,y1…yj时的最长公共子序列的大小,下图给出求解过程:
求解过程
首先将矩阵第0行和第0列初始化为0,从(1,1)位置开始逐行(逐列)计算。
如果此位置X和Y匹配,斜上方保存的是xi-1,yj-1状态的最优值,那么此位置保存的是上一状态的最优值加一。
如果此位置X和Y不匹配,此位置左侧存储的是xi,yj-1状态的最优值,上侧存储的是xi-1,yj状态的最优值,我们要取其中的最大值作为当前状态最优值。
图片中的箭头代表的是当前位置的最优值取自于哪个初始状态,当计算到最后我们按照箭头就可以得到相应的最优解对应的序列。