198.House Robber 盗窃最大值问题 | 虎哥笔记之动态规划

Posted BitTiger

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了198.House Robber 盗窃最大值问题 | 虎哥笔记之动态规划相关的知识,希望对你有一定的参考价值。

大家好,我是刷题精虎哥。今天给大家讲一道典型的一维空间动态规划的题目。虽然题目很简单,但是很多学员的思路并没有打通。所以有必要再给大家梳理一下(文末有万能模板送给大家)。话不多说,上题!

 


题⽬

 

Youare a professional robber planning to rob houses along a street. Each house hasa certain amount of money stashed, the only constraint stopping you fromrobbing each of them is that adjacent houses have security system connected andit will automatically contact the police if two adjacent houses were brokeninto on the same night. Given a list of non-negative integers representing theamount of money of each house, determine the maximum amount of money you canrob tonight without alerting the police.


翻译:你是一个职业盗贼,锁定了一条大街准备今晚作案,街上每栋房子里都有固定量的财务。但是相邻的房子之间有报警器,一旦两个相邻的房子在同一晚被盗,就会触发报警器。现已知一系列非负整数表示每个房子里的财务数目,请计算在不触发报警器的情况下,你今晚可以盗取的最大值。


虎哥注:建议大家先不要往下看,拿出纸笔自己想一下这道题,有个思路就可以。

 

198.House Robber 盗窃最大值问题 | 虎哥笔记之动态规划


思路

 

因为这道题让我们去房子里偷东西,所以我的第⼀个想法是从第⼀个房子开始判断是否偷窃。


虎哥注:当没思路的时候,就先找一个具体的节点试着开始推。


因为我可以选择偷或者不偷两种选择,所以我们会有两个分⽀条件。假设⼀共有四个房子ABCD。那么我们会有以下两个分⽀选择:


虎哥注:房子是线性排列的,不用看就知道是一维空间。虽然题目没有说有几个房子,但是我们可以先假设一个小一点的数值,帮助我们具体思考,进一步弄懂题目想要考什么鸟蛋,抽象出模型来。


198.House Robber 盗窃最大值问题 | 虎哥笔记之动态规划


于是我们可以知道,虽然我们⼀开始想要得到在ABCD中进⾏偷窃的最⼤收益,但是现在这个问题变成了两个⼦问题:


  • 计算在CD中的最⼤收益,然后加上A房子的收益

  • 计算在BCD中的最⼤收益


然后,我们比较上⾯两个选项,就能知道在ABCD中选择的最⼤收益。


针对在BCD中选择房子,获得最⼤收益的问题,我们可以同样的进⾏拆解。


虎哥注:当你发现可以继续以同样方式拆解的时候,离答案就不远了。

 

198.House Robber 盗窃最大值问题 | 虎哥笔记之动态规划


这时候,我们发现其中的⼀个⼦问题计算在CD中选择的最⼤收益。这个问题在ABCD的时候也出现了。我们可以重新计算⼀遍,但是也可以把之前的答案保存下来,这⾥就不需要计算了。


那么我们需要保存的答案都有哪些呢?ABCD、BCD、CD、D。也就是从⼀个节点到终点的情况。于是我们可以构建数组memo[x],其中的x表示的是剩余元素的个数。


虎哥注:一维空间基本都可以使用这样的表达式构建。


于是上述的四种情况,分别对应memo[4]、memo[3]、memo[2]、memo[1]。


因此,我们的⽬标是memo[4],它的结果可以拆解为两个⼦问题:

  • memo[2] + Value_A

  • memo[3]

同理,当我们计算memo[3]的时候,它的结果可以拆解为两个⼦问题:

  • memo[2] + Value_B

  • memo[1]


虎哥注:我们先把前面的思维过程表示为数学表达式,之后再转换为代码。


这样,我们可以写出我们的代码:


198.House Robber 盗窃最大值问题 | 虎哥笔记之动态规划

 

虎哥注:我再出一个follow up问题,如果房⼦是⼀个⼆维的矩阵,针对⼀个点,可以选择它是否偷窃,要怎么做?大家思考一下,具体解法就不在这里赘述了

 

总结

 

备忘模型+一维模型:针对房⼦的⼀个区间选择进⾏备忘。


虎哥注:这道题属于备忘模型在一维解空间中的运用,下图中的五角星标明了本题在万能模板中的位置。市面上绝大多数解法都可以整理到这个独家模板中来,请大家熟记于心。

 

198.House Robber 盗窃最大值问题 | 虎哥笔记之动态规划

图:如何套用万能模板理解此类题型

 

虎哥注:在做完题之后,不要急着刷下一道,应该退一步从big picture的角度反思运用了哪些模型,属于模板的哪个部分,这样可以更好区分不同题型。一开始拿到题也要用这个思路去想。本周末沁原会讲这个万能模板的用法,以及104道动态规划题的归类和follow up。如果你没有解答出来这道题,或者对follow up还有点晕,非常建议来听一下,课也不贵。话不多说了,以下是硬广,请大家自取所需

 

课程费用

 

原价:$98

折扣价:$68

【BitTiger直通车学员免费参加】详情请咨询班主任老师

【新学员特殊优惠】查看下 方海报,获取折扣方式

 

课程时间


*以美西时间为例

4/14(周六)9am-12pm

4/15(周日)9am-12pm

 

内容安排


动态规划核心模型:备忘模型、演绎模型
解空间的样式:多维空间、比特空间、树形空间和图形空间
应对难题的技巧:遍历法、累积法、比较法、搜索剪枝

金牌讲师


冯沁原

BitTiger.io联合创始人、前阿里巴巴高级专家、前酷我音乐总监,北京大学博士、微软亚洲学者。BitTiger算法与系统设计主讲老师与教学总监,擅长帮助学员解决实际问题,梳理考点难点,掌握方法,举一反三,融会贯通。其独特的生长学习法以及算法与系统设计教学视频让10万学员实现能力提升。

 

查看课程详情及安排


复制链接或点击阅读原文

http://t.cn/RmzJ8tj



以上是关于198.House Robber 盗窃最大值问题 | 虎哥笔记之动态规划的主要内容,如果未能解决你的问题,请参考以下文章

leetcode 198. House Robber 求抢劫的最大金额 ---------- java

LeetCode 198:House Robber

LeetCode 198:House Robber

198. House Robber

198. House Robber

刷题198. House Robber