读《图解算法》08-动态规划

背包问题

  • 继续上面贪婪算法的背包问题场景

简单算法

  • 尝试各种可能的组合,并找出价值最高的组合
  • 3 件商品就会计算 8 个组合,4 件商品就会计算 16 个集合
  • 这就是前面说到的集合覆盖问题,每增加一件商品,需要计算的都要翻倍
  • 这种简单算法的运行时是 O(2 ~n)2 的 n 次方
  • 所以一多,这种算法就行不通,之前就用了近似算法

动态规划

  • 动态规划就是背包问题的最优解
  • 动态规划的本质是先解决子问题,再逐步解决大问题
  • 每个动态规划都从一个网格开始
  • 每个子问题都是离散的,不相互依赖才可以

最长公共子串

  • 单元格中的值通常就是你要优化的值。在前面背包问题中,单元格中的值就是你要优化的值。
  • 每个单元格都是子问题

场景

  • 用户输错了单词,本来想输 fish,但是输了 hish
  • 假设与 hish 类似的词只有两个(实际上上千个),fish 和 vista,怎么确定是哪一个(哪个单词和它更像)
  • hish 和 fish 都包含的最长公共子串是 ish,用网格来算
  • hish 和 vista 都包含的最长公共子串是 is,用网格来算
  • 因为 fish 的最长公共子串是 3 个,因此用户应该是想输入它

最长公共子序列

  • 与最长公共子串计算方式不一样

动态规划应用

  • git diff 比较文件差异
  • 生物学家使用最长公共子序列来确定 dna 的相似性