贪婪算法
- 贪婪算法并不能得到最优解,因为每步都是局部最优解
动态规划
- 使用动态规划时,要么考虑拿走整件商品,要么考虑不拿,而没法判断该不该拿走商品的一部分。
问题:
- 假设你要去伦敦度假,假期两天,但你想去游览的地方很多。你没法前往每个地方游览,因此你列个单子。
名胜 | 时间 | 评分 |
---|---|---|
威斯敏斯特教堂 | 0.5天 | 7 |
环球剧场 | 0.5天 | 6 |
英国国家美术馆 | 1天 | 9 |
大英博物馆 | 2天 | 9 |
圣保罗大教堂 | 0.5天 | 8 |
- 思路:
- 使用网格,先建立空网格
0.5 | 1 | 1.5 | 2 |
---|---|---|---|
威斯敏斯特教堂 | |||
环球剧场 | |||
英国国家美术馆 | |||
大英博物馆 | |||
圣保罗大教堂 |
- 网格填充结果
0.5 | 1 | 1.5 | 2 |
---|---|---|---|
威斯敏斯特教堂(w) | 7(w) | 7(w) | 7(w) |
环球剧场(g) | 7(w) | 13(wg) | 13(wg) |
英国国家美术馆(n) | 7(w) | 13(wg) | 16(wn) |
大英博物馆(b) | 7(w) | 13(wg) | 16(wn) |
圣保罗大教堂(s) | 8(s) | 15(ws) | 21(wgs) |
填充表格从左到右,然后下一行,重复。
最长公共子串
问题:HISH和FISH的最长公共子串是?
思路:
- 画表格
H | I | S | H |
---|---|---|---|
F | |||
I | |||
S | |||
H |
- 填充表格
H | I | S | H |
---|---|---|---|
F | 0 | 0 | 0 |
I | 0 | 1 | 0 |
S | 0 | 0 | 2 |
H | 0 | 0 | 0 |
若果横纵字母相同则对应空格为1加上空格左上角邻居的值
# 实现这个公式的伪代码
if word_a[i] == word_b[j]: # 两个字母相同
cell[i][j] = cell[i-1][j-1] + 1
else: # 两个字母不同
cell[i][j] = 0
最长公共子序列之解决方案
最长公共子序列:两个单词都有的序列包含的字母数
问题:求fish和fosh的最长公共子序列
思路:
- 画网格
H | O | S | H |
---|---|---|---|
F | |||
I | |||
S | |||
H |
- 填充表格
H | O | S | H |
---|---|---|---|
F | 1 | 1 | 1 |
I | 1 | 1 | 1 |
S | 1 | 1 | 2 |
H | 1 | 1 | 2 |
如果两个字母不同,就选择上方和左邻居中较大的那个
如果两个字母相同,就将当前单元格的值设为左上方单元格的值加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])