动态规划|相邻约束下的最优解

本篇进一步介绍动态规划的基本应用。

1

题目

You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed, the only constraint stopping you from robbing each of them is that adjacent houses have security system connected and it will automatically contact the police if two adjacent houses were broken into on the same night.

Given a list of non-negative integers representing the amount of money of each house, determine the maximum amount of money you can rob tonight without alerting the police.

相邻房子不能同时偷,求在此约束下,偷n个房子获益的最大值。

2

分析

分析以下例子:

房子编号:0 1 2 3 4 5

房子收益:4 2 8 6 1 3

目标:偷n个房子获益的最大值。

约束条件:相邻房子不能同时偷。

可能的操作序列:

0 2 4

0 2 5

0 3 5

1 3 5

1 4

小偷面对编号为 i 的房子时,他会有两种决策:

1) 偷(暗含着前一个房子没偷)

2)不偷(注意不一定暗含着前一个房子一定偷了,如果想成前一个房子一定要偷,这就表示偷房子的序列为间隔性的能偷的最大钱数,这是不一定的,比如:3,2,2,3,最大收益为6,中间隔了两个房子!)

如何做决策?

分别比较下这两种决策下的最大能偷的钱数:

1)偷 i,能获得收益为: maxval = num[i] + premax,其中 premax 表示前一个房子没偷能拿到的最大钱数;

2)不偷 i,能获得最大收益为:premax 和前一个房子偷了能获得最大收益,的最大值,即 premax = max(premax, maxval),需要注意:

前一个房子偷了能获得最大收益 为上一步的maxval(它就是表示偷了 i,所以需要用一个临时变量存储起来,供下一个时步用)

可以看到这两种情况相互耦合

1)的premax实际上是上一时步 2)的premax

2)的maxval实际上是上一时步 1)的maxval

最后一步,遍历结束后,取 maxval和premax的最大值

3

代码

python代码,代码很简单,就几行,但是里面暗含的意义都非常大。

premax, maxval = 0,0 for val in nums: tmp = maxval maxval = val + premax premax = max(premax,tmp) return max(premax,maxval)

原文发布于微信公众号 - 算法channel(alg-channel)

原文发表时间:2018-03-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程

英语不好,能看懂编程吗?

学会编程不需要多高深的英语水平,想要学会编程,简单的英语水平足够了,现在的程序开发环境又很友好,基本上打开之后不需要怎么配置,直接写代码就行,程序语言无外乎顺序...

2170
来自专栏非著名程序员

如何评价一段代码

经常有人微信问我,什么样的代码才算是好代码。这个问题其实见仁见智,业内也没有统一的标准可以使用。我仔细梳理了一下自己评价代码的方法,总结了五个评价指标。 1、规...

1799
来自专栏我是攻城师

统计学里面的百分位数是什么意思

6035
来自专栏日常学python

一行Python代码能干嘛?

python有很多优雅有趣的代码写法,同时还很简短,以至于当我刚开始接触这个编程语言的时候,就爱不释手。而前几天的编程语言榜单中python也超越了java成为...

1220
来自专栏算法channel

动态规划中篇:爬楼梯

主要推送关于对算法的思考以及应用的消息。培养思维能力,注重过程,挖掘背后的原理,刨根问底。本着严谨和准确的态度,目标是撰写实用和启发性的文章,欢迎您的关注。 0...

4099
来自专栏java一日一条

如何掌握所有的程序语言

很多编程初学者至今还在给我写信请教,问我该学习什么程序语言,怎么学习。由于我知道标题问题的答案,所以总感觉这个问题是如此“低级”,一直没来得及回复 : P 可是...

620
来自专栏程序员互动联盟

【专业技术】结构化与面向对象到底啥区别?

存在问题: 什么是面向对象什么是结构化,这个问题一直困惑着很多新手,不容易搞清楚。 解决方案: 1.基本原则的对比: 结构化方法的基本思想就是将待解决的问题看作...

2705
来自专栏ThoughtWorks

像机器一样思考|TW洞见

今日洞见 文章作者、部分图片来自ThoughtWorks:仝键。 本文所有内容,包括文字、图片和音视频资料,版权均属ThoughtWorks公司所有,任何媒体、...

3747
来自专栏包子铺里聊IT

解锁 Leetcode 新题:寻找明星

Suppose you are at a party with n people (labeled from 0 to n - 1) and among the...

3776
来自专栏人工智能头条

知识图谱系列 | 知识图谱的前世今生与RDF的实践

【人工智能头条导读】本文是我们知识图谱系列的第二篇文章,希望人工智能头条为大家准备的文章对大家的学习有更多的帮助。

6122

扫码关注云+社区

领取腾讯云代金券