算法图解第九章笔记与习题(动态规划)
文章目录
算法图解pdf百度云链接,提取码:jttg
9.1 动态规划
十分详细的动态规划漫画图解。
动态规划对每个单元格计算其最大价值的公式为:
9.2 背包问题FAQ
- 可以偷商品的一部分吗?
答案是不可以,因为在动态规划中,没有一部分这种状态。如果需要考虑一部分这种情况,那么可以使用贪婪算法。
- 动态规划可以处理相互依赖的子问题吗?
答案是不可以,动态规划的强大之处在于它可以解决子问题并用这些子问题的答案来解决大问题。但只有在这些子问题不依赖其他子问题时,才能够单独求解,用来解决大问题。
9.3 最长公共子串
- 动态规划可帮助你在给定约束条件下找到最优解。在背包问题中,你必须在背包容量给定的情况下,偷到价值最高的商品。
- 在问题可分解为彼此独立且离散的子问题时,就可使用动态规划来解决。
要设计出动态规划解决方案可能很难,下面是一些通用的小贴士:
- 每种动态规划解决方案都涉及网格。
- 单元格中的值通常就是你要优化的值。在前面的背包问题中,单元格的值为商品的价值。
- 每个单元格都是一个子问题,因此你应考虑如何将问题分成子问题,这有助于你找出网格的坐标轴。
对于最长公共子串问题而言,需要找到两个字符串中最长的公共子串。举例两个字符串为:hish
和vista
。
因此可将两个字符串的字母作为坐标,而其最长子串长度为单元格内的值。
由于目标为最长子串,因此必须是连续的。伪代码如下:
if word_a[i] == word_b[j]: # 两个字母相同
cell[i][j] = cell[i-1][j-1] + 1
else: # 两个字母不同,则子串结束,单元格置零
cell[i][j] = 0
9.3.1 最长公共子序列
最长公共子序列相比于最长公共子串可能更能够得到字符串间的相似度。其所比较的内容为:两个单词中都有的序列包含的字母数。这个问题的解答更类似于背包问题。
由于不再要求连续,仅需要相同的字符序列越多越好。伪代码如下:
if word_a[i] == word_b[j]: # 两个字母相同
cell[i][j] = cell[i-1][j-1] + 1
else: # 两个字母不同,子序列仍继续,单元格取左或上方向的最大值
cell[i][j] = max(cell[i-1][j], cell[i][j-1])
9.3.2 动态规划的应用
- 生物学家根据最长公共序列来确定DNA链的相似性,进而判断度两种动物或疾病有多相似。最长公共序列还被用来寻找多发性硬化症治疗方案。
- 你使用过诸如git diff等命令吗?它们指出两个文件的差异,也是使用动态规划实现的。
- 前面讨论了字符串的相似程度。编辑距离(levenshtein distance)指出了两个字符串的相似程度,也是使用动态规划计算得到的。编辑距离算法的用途很多,从拼写检查到判断用户上传的资料是否是盗版,都在其中。
- 你使用过诸如Microsoft Word等具有断字功能的应用程序吗?它们如何确定在什么地方断字以确保行长一致呢?使用动态规划!
9.4 小结
- 需要在给定约束条件下优化某种指标时,动态规划很有用。
- 问题可分解为离散子问题时,可使用动态规划来解决。
- 每种动态规划解决方案都涉及网格。
- 单元格中的值通常就是你要优化的值。
- 每个单元格都是一个子问题,因此你需要考虑如何将问题分解为子问题。
- 没有放之四海皆准的计算动态规划解决方案的公式。
练习
习题9.1:
- 假设你还可偷另外一件商品——MP3播放器,它重1磅,价值1000美元。你要偷吗?
偷。
习题9.2:
- 假设你要去野营。你有一个容量为6磅的背包,需要决定该携带下面的哪些东西。其中每样东西都有相应的价值,价值越大意味着越重要。
- 水(重3磅,价值10);书(重1磅,价值3);食物(重2磅,价值9);夹克(重2磅,价值5);相机(重1磅,价值6)。 请问携带哪些东西时价值最高?
水,食物,相机。
习题9.3:
- 请绘制并填充用来计算blue和clues最长公共子串的网格。
B | L | U | E | |
---|---|---|---|---|
C | 0 | 0 | 0 | 0 |
L | 0 | 1 | 0 | 0 |
U | 0 | 0 | 2 | 0 |
E | 0 | 0 | 0 | 3 |
S | 0 | 0 | 0 | 0 |