DP KMP python

贪婪算法

  • 贪婪算法并不能得到最优解,因为每步都是局部最优解

动态规划

  • 使用动态规划时,要么考虑拿走整件商品,要么考虑不拿,而没法判断该不该拿走商品的一部分。

问题:
- 假设你要去伦敦度假,假期两天,但你想去游览的地方很多。你没法前往每个地方游览,因此你列个单子。

名胜 时间 评分
威斯敏斯特教堂 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])

猜你喜欢

转载自blog.csdn.net/zhangyu4863/article/details/81738772