[MIT6.006] 21. Daynamic Programming III: Parenthesization, Edit Distance, Knapsack 动态规划III:括号问题,编辑距离,背包问题

这节课主要针对字符串/序列上的问题,了解如果使用动态规划进行求解。上节课我们也讲过使用前缀和后缀的概念,他们如下所示:

接下来,我们通过三个问题来深入了解下动态规划使用前缀、后缀和子串怎么去解决括号问题,编辑距离,背包问题

 

一、括号问题 Parenthesization

在进行一些列矩阵乘法时,我们如果设计括号,可以使计算更加高效?

解决过程如下图所示:

 

  1. 子问题:求矩阵们A的最优相乘方式;
  2. 猜:上一次矩阵相乘应在哪?
  3. 递归:最小化矩阵相乘的损失;
  4. 拓扑排序:增加子串的大小;
  5. 原问题:DP(0, n);

 

二、编辑距离 Edit Dsitance

给定两个字串x和y,让x变成y的最廉价的字符编辑操作是怎样的?编辑距离问题在很多地方有应用,例如:拼写纠正,DNA编辑和找到最长公共子序列。

 

它的动态规划解题步骤如下:

 

  1. 子问题:在x[i:]和y[j:]后缀上做距离编辑了;
  2. 猜:是使用替换,插入还是删除操作;
  3. 递归:选择能最小化编辑损失的操作;
  4. 拓扑排序:相当于在DAG中找最短路径;
  5. 原问题:DP(0, 0)。

 

三、背包问题 Knapsack

假设你有n个物品,单个物品占用空间是si,价值是vi,请问如何往空间为S的塞进哪些物品能使它们价值最大?该问题动态规划解题步骤如下:

 

  1. 子问题:第i个物体的前缀和剩余空间X;
  2. 猜:是否将第i个物体放入背包;
  3. 递归:选择能最大化价值且不超过背包容量的操作;

注:这个伪polynomial时间我也不太了解(好像是说该动态规划的时间介于polynomial时间和指数时间之间),后续有待补充。

 

posted @ 2020-05-13 12:30  Alvin_Ai  阅读(626)  评论(0)    收藏  举报