硅谷程序员进阶之路算法设计:动态规划偷金子

Posted BitTiger

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了硅谷程序员进阶之路算法设计:动态规划偷金子相关的知识,希望对你有一定的参考价值。

写在前面
我们将每天为大家分享沁原老师的电子书《硅谷程序员之路》。这是一本和大家一起成长的电子书,帮助太阁的朋友们共同学习,不断进步。以下内容均来自沁原老师。

偷金子


有连续的n个房子,每个房子有一定的金币。当小偷偷取两个连续的房子时会引发报警,请问这个小偷最多能偷多少金币?



思考一
枚举可以吗?
让我们枚举所有情况吧
  • A=4
  • A+C=7
  • A+D=5
  • B=5
  • B+D=6
  • C=3
  • D=1
    
从中可以看出,最优解是A+C=7
因为需要枚举几乎所有可行的方案,因此这个方法的复杂度大概是O(2^n)。


思考二

能不能快一点?


让我们可视化整个过程,


【硅谷程序员进阶之路】算法设计:动态规划(二)偷金子


上面这棵树可视化了我们整个分析过程。
  • 每一步的抉择在于是否偷一个房子,所以有两个分支
  •  每一步做完抉择之后,会有经过的房子的偷窃情况的记录和剩余房子的记录,因此有两个集合

图中的树并没有画完全,但是右侧箭头所指的子树和左侧箭头所指的子树是重复的。换句话说,如果左侧计算过一次了,右侧不需要再计算了。(是否发现这个和斐波那契数列很相似)
我们还会发现,每个子树的意义在于,对剩下的集合求偷窃的最大值。
于是,得解。

思考三
如果一个房子里的金币会是负数呢?

乍一看似乎有问题,但是真的有问题吗?因为我们一定会枚举到最优的解,所以算法没有问题。

思考四
如果房子是环形的呢?
当形成环的时候,我们的可视化需要修改吗?


【硅谷程序员进阶之路】算法设计:动态规划(二)偷金子


通过可视化,我们发现,只需要修改图中的红色位置即可。

太阁实验室
有趣,有用,有效;
刷项目,做实战,捅破技术那层纸
论码农的自我修养
WeChat ID: bit_tiger
长按二维码,关注我哟~
点击“阅读原文”获取更多内容

以上是关于硅谷程序员进阶之路算法设计:动态规划偷金子的主要内容,如果未能解决你的问题,请参考以下文章

从程序员进阶到架构师,6大核心技能要领详解

Java进阶之路,Java程序员职业发展规划

算法刷题打卡041 | 动态规划9-打家劫舍系列

算法与程序设计:动态规划算法

学界0-1背包问题的动态规划算法

《程序设计与算法算法基础》《第六周 分治》动态规划