其实这本书我已经在读第二次了,之前的章节都没有特别深的感悟,有些东西只是温故;
而在动态规划这章节,再次地阅读却让我知新,对动态规划算法有了更深一步的理解。
好的算法就是这样经久不衰,就像好的影视剧作品,能够吸引我们再三观看,揣摩。
章节内容
- 学习动态规划
- 设计问题的动态规划解决方案
背包问题
在之前一章的背包问题中,我们找到的近似解却不是最优解。如何找到最优解?
我们这边不妨把音响$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列等于一下两者的最大值: |
- 上一个单元格第i-1行第j列的价值
- 当前商品的价值+剩余空间价值
最长公共子串
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
小结
- 需要在给定约束条件下优化某种指标,动态规划很有用
- 问题可分解为离散子问题,可使用动态规划
- 每种动态规划解决方案都涉及网络
- 单个园中的值通常就是你要优化的值
- 每个单元格都是一个子问题,因此你需要考虑如何将问题分解为子问题
- 没有放之四海皆准的计算动态规划解决方案的公式