一、动态规划法的基本要素

  • 最优子结构性质:最优子结构性质——用动态规划法求解的前提。当一个问题的最优解中包含了其子问题的最优解时,称该问题具有最优子结构性质。

  • 重叠子问题性质:(递归算法求解问题时)每次产生的子问题并不总是新问题,有些子问题被反复计算多次,这种性质称为子问题重叠性质。

二、动态规划法求解思路——自底向上、保存子问题的解

三、动态规划法求解步骤

  • 1)刻画最优解的结构特性

  • 2)递归定义最优解值

  • 3)以自底向上方式计算最优解值

  • 4)根据计算得到的信息构造一个最优解

四、动态规划法与分治法的比较

共同点:

将待求解的问题分解成若干子问题,先求解子问题,然后再从这些子问题的解得到原问题的解。

都是求解最优化问题;都具有最优子结构性质

不同点:

1、适合于用动态规划法求解的问题,分解得到的各子问题往往不是相互独立的;而分治法中子问题相互独立

2、动态规划法用保存已求解过的子问题的解,再次碰到同样的子问题时不必重新求解,而只需查询答案,故可获得多项式级时间复杂度,效率较高;而分治法中对于每次出现的子问题均求解,导致同样的子问题被反复求解,故产生指数增长的时间复杂度,效率较低。

3、求解方式不同:

动态规划法:自底向上

贪心法:自顶向下。以迭代的方式作出相继的贪心选择,每作一次贪心选择就将所求问题简化为一个规模更小的子问题。

4、对子问题的依赖不同:

动态规划法:依赖于各子问题的解。只有在解出相关子问题后,才能作出选择;应使各子问题最优,才能保证整体最优

贪心法:不依赖于子问题的解。仅在当前状态下作出最好选择,即局部最优选择

五、多段图问题

  • 向前递推式

  • 向后递推式

  • 结点的cost和d值求解过程

  • 最短路径长度,并根据d值构造最短路径

  • 注意:d[j] 的含义和最短路径的构造。

  • 课后习题 7-1,7-2

六、关键路径问题

  • earliest、latest的递推式和求解过程
  • 事件i可能的最早发生时间earliest(i):指从开始结点 s 到结点 i 的最长路径(关键路径)长度
  • 事件i允许的最迟发生时间latest(i):指在不影响工期的条件下,事件(结点) i 允许的最晚发生时间;等于 earliest(n-1) 减去从结点 i 到结点 n-1 的最长路径长度
  • 寻找关键活动:若 latest(j)-earliest(i)=w(i,j),则边<i,j>代表的活动是关键活动
  • 构造关键路径:关键活动组成的关键路径上每个结点 (i和j) 都有 latest(i)=earliest(i)
  • 最长路径长度——完成工程的最短时间
  • 程序实现
  • 性能分析:关键路径算法与拓扑排序有相同的时间复杂度,其时间复杂度为 O(n+e)
  • 补充题
  • 注意:应由关键活动<i,j>(而不是事件i)来确定关键路径。

七、费洛伊德算法

  • dk 数组和 pathk 数组更新的递推式
  • 每次迭代后的d数组和path数组元素值
  • 程序实现和时间复杂度:O(n^3)

八、最长公共子序列(LCS)

  • c和s数组元素的求解递推式:

    导出序列Xi=(x1,x2,…,xi)和Yj=(y1,y2,…,yj)的最长公共子序列的递推关系:

    ⑴若xi=yj,则先求Xi-1和Yj-1的最长公共子序列,并在其尾部加上xi便得到了Xi和Yj的最长公共子序列;
    ⑵若xi≠yj,则必须分别求解两个子问题Xi-1和Yj以及Xi和Yj-1的最长公共子序列,这两个公共子序列中的较长者就是Xi和Yj的最长公共子序列。

  • c和s数组元素求值,得最优解值

  • 证明回溯构造最优解

  • 程序实现:时间复杂度为O(m*n)

  • 课后习题7-9

九、备忘录方法

1)动态规划法的变形。
2)采用分治法的思想。
3)自顶向下直接递归的方式求解。
——两者的异同和适用场合

备忘录方法与动态规划法比较

1、与动态规划法的共同点:用一个表格来保存已求解的子问题的答案,使下次需要解此子问题时,只简单地查看答案,不重新计算。

2、与动态规划法的区别:备忘录的递归方式是自顶向下,而动态规划法的递归方式是自底向上

备忘录方法与递归方法比较

1、与递归方法的共同点:递归方式均为自顶向下

2、与递归方法的区别:备忘录方法用一个表格来保存已求解的子问题的答案,使下次需要解此子问题时,只简单地查看答案,不重新计算;而递归方法在每次遇到子问题都要重新计算

如何选择使用动态规划法或备忘录法?
  • 当一个问题的所有子问题都至少要解一次时,选用动态规划法较好,此时没有任何多余的计算,还可利用规则的表格存取方式,减少时间和空间需求。

  • 当一个问题只有部分子问题需要求解时,选用备忘录法较好,它只解那些确实需要求解的子问题。

十、0/1背包

  • 0/1背包问题动态规划法求解——自底向上

  • 0/1背包问题具有最优子结构特性:

设(x0,x1,…,xn-1),xi∈{0,1} 是0/1背包的最优解。那么(x0,x1,…,xn-2)必然是0/1背包子问题的最优解。

  • 0/1背包问题(实数重量)阶跃点集合求解——非启发式方法、启发式方法
    注意:被支配的阶跃点和所有X>M的阶跃点均应该去除。
  • 课后习题7-15、补充题
  • 实验补充——装载问题。