算法图解 (九)

动态规划

动态规划(英语:Dynamic programming,简称DP)是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。

背包问题

简单算法, 书中一开始是通过排列组合的方式, 但是速度有些慢, 时间复杂度为 O(n2)

引入动态规划, 将背包问题绘制成表格

[图片上传失败...(image-a29e02-1528622649240)]

音响(3000美元、 4磅)、 笔记本电脑(2000美元、3磅)、 吉他(1500美元、1磅)

最终结果, 将吉他和笔记本电脑放入背包时价值最高, 为 3500 美元
[图片上传失败...(image-65950a-1528622649240)]

最长公共子串

引入一个例子。 假设你管理着网站 dictionary.com。 用户在该
网站输入单词时, 你需要给出其定义。

但用户拼错了, 你必须要猜测他原本要输入的是什么单词。 例如, Alex 想查单词fish, 但不小心输入了hish。 在你的字典中, 根本就没有这样的单词, 但有几个类似的单词。

同样绘制表格, 这其实是求最长公共子串

image

最长公共序列

[图片上传失败...(image-ce6269-1528622649240)]

image

伪代码

if word_a[i] == word_b[j]: # 两个字母相同 
    cell[i][j] = cell[i-1][j-1] + 1
else:  # 两个字母不同
    cell[i][j] = max(cell[i-j][j], cell[i][j-1) 

小结

书上的例子还是比较好理解的, 实际中的那些题目可能就够呛了

最后附上小灰漫解动态规划: https://juejin.im/post/5a29d52cf265da43333e4da7

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,466评论 25 708
  • 一. 原理: 动态规划: 每个阶段的最优状态可以从之前某个阶段的某个或某些状态直接得到而不管之前这个状态是如何得到...
    林大鹏阅读 523评论 0 2
  • 取景点:利用辅助线拍摄对称的阶梯和大门 取景点: 逛顺电时看到电脑区域吊顶装修比较有特色,取其圆形吊环和周伟散发的灯光
    猎鹰仔阅读 161评论 0 0
  • 印度明星阿米尔汗为了拍《摔跤吧,爸爸》更逼真,增肥至194斤,体脂率37%。而后又减掉60斤,体脂率从37%降到9...
    咿呀作语阅读 216评论 0 3
  • 昨天晚上有个陌生朋友问我:你知道怎么申请公众号吗? 我迅速回答:网页上照提示申请。 这位朋友秒回:好的谢谢。附加一...
    贝妮阅读 259评论 0 0