DP KMP python

贪婪算法

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

动态规划

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

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

名胜时间评分
威斯敏斯特教堂0.5天7
环球剧场0.5天6
英国国家美术馆1天9
大英博物馆2天9
圣保罗大教堂0.5天8

- 思路:
- 使用网格,先建立空网格

0.511.52
威斯敏斯特教堂
环球剧场
英国国家美术馆
大英博物馆
圣保罗大教堂

- 网格填充结果
0.511.52
威斯敏斯特教堂(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的最长公共子串是?

  • 思路:

    • 画表格

HISH
F
I
S
H

- 填充表格
HISH
F000
I010
S002
H000

若果横纵字母相同则对应空格为1加上空格左上角邻居的值

# 实现这个公式的伪代码
if word_a[i] == word_b[j]:  # 两个字母相同
    cell[i][j] = cell[i-1][j-1] + 1
else:  # 两个字母不同
    cell[i][j] = 0

最长公共子序列之解决方案

  • 最长公共子序列:两个单词都有的序列包含的字母数

  • 问题:求fish和fosh的最长公共子序列

  • 思路:

    • 画网格

HOSH
F
I
S
H

- 填充表格
HOSH
F111
I111
S112
H112

如果两个字母不同,就选择上方和左邻居中较大的那个
如果两个字母相同,就将当前单元格的值设为左上方单元格的值加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])
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值