《图解算法》读书笔记(九) 动态规划

其实这本书我已经在读第二次了,之前的章节都没有特别深的感悟,有些东西只是温故;
而在动态规划这章节,再次地阅读却让我知新,对动态规划算法有了更深一步的理解。
好的算法就是这样经久不衰,就像好的影视剧作品,能够吸引我们再三观看,揣摩。

章节内容

  • 学习动态规划
  • 设计问题的动态规划解决方案

背包问题

在之前一章的背包问题中,我们找到的近似解却不是最优解。如何找到最优解?
我们这边不妨把音响$3000、笔记本电脑$2000、吉他$1500的重量分别修改为4、3、1磅。背包可装4磅的东西。

简单算法

我们需要尝试各种商品的组合,并找到价值最高的组合。这是一个幂级的复杂度

动态规划

对于背包问题,我们先解决小背包问题,再逐步解决原来的问题。
假设有如下表格

1磅 2磅 3磅 4磅
吉他
音响
电脑
假设只有吉他可以装,因为吉他重量为1磅,所以无论背包可以装多重,最高价值都是1500。
1磅 2磅 3磅 4磅
---- --- --- --- ---
吉他 1500 1500 1500 1500
音响
电脑
现在来填充第二行,假设这时候多了音响可以装。
因为音响重量为4磅大于1,2,3,所以前面三个不变,背包为4磅的时候可以装下音响,因为音像的价格大于之前的1500,所以选择装音响。
1磅 2磅 3磅 4磅
---- --- --- --- ---
吉他 1500 1500 1500 1500
音响 1500 1500 1500 3000
电脑
这时候多了笔记本电脑可以装,我们来填充第三行。
因为笔记本电脑为3磅,前面两个不变。磅数等于3的时候因为电脑价格2000大于之前的1500,所以选择2000。
最后背包为4磅的时候,我们根据背包为3磅的时候最高价值为2000,这时候还剩下1磅可以装吉他,总价值为3500.大于之前的3000。
1磅 2磅 3磅 4磅
---- --- --- --- ---
吉他 1500 1500 1500 1500
音响 1500 1500 1500 3000
电脑 1500 1500 2000 3500
我们得到一个公式:
第i行第j列等于一下两者的最大值:
  1. 上一个单元格第i-1行第j列的价值
  2. 当前商品的价值+剩余空间价值

最长公共子串

cell[i][j] = word1[i] == word2[j] ? cell[i-1][j-1] + 1 : 0

最长公共子序列

cell[i][j] = word1[i] != word2[j] ? max(cell[i][j-1],cell[i-1][j]) : cell[i-1][j-1] + 1

小结

  1. 需要在给定约束条件下优化某种指标,动态规划很有用
  2. 问题可分解为离散子问题,可使用动态规划
  3. 每种动态规划解决方案都涉及网络
  4. 单个园中的值通常就是你要优化的值
  5. 每个单元格都是一个子问题,因此你需要考虑如何将问题分解为子问题
  6. 没有放之四海皆准的计算动态规划解决方案的公式
posted @ 2020-09-07 22:55  無花無酒鋤作田  阅读(147)  评论(0编辑  收藏  举报