【题目描述】
After robbing those houses on that street, the thief has found himself a new place for his thievery so that he will not get too much attention. This time, all houses at this place are arranged in a circle. That means the first house is the neighbor of the last one. Meanwhile, the security system for these houses remain the same as for those in the previous street.
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.
Notice
This is an extension of House Robber.
在上次打劫完一条街道之后,窃贼又发现了一个新的可以打劫的地方,但这次所有的房子围成了一个圈,这就意味着第一间房子和最后一间房子是挨着的。每个房子都存放着特定金额的钱。你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自动报警。
给定一个非负整数列表,表示每个房子中存放的钱, 算一算,如果今晚去打劫,你最多可以得到多少钱 在不触动报警装置的情况下。
注意事项
这题是House Robber的扩展,只不过是由直线变成了圈
【题目链接】
www.lintcode.com/en/problem/house-robber-ii/
【题目解析】
House Robber的延伸问题,将线性(linear)排列改成环形(cycle),DP的策略需要进行相应的调整,由于定义了不能选择相邻的房子,可以分别计算两种情况,一个选择nums[0],那么就不能选择nums[nums.length],或者选择nums[nums.length],就不可以选择nums[0],这样,环形的问题就分解成为两个线性问题,最后取两个结果中的最大值即可。
简单的示例如下:
nums = [3,6,4]
第一种,选nums[0]
[3,6,X]
第二种,选nums[nums.length]
[X,6,4]
为了下标的标注方便,统一两个DP数组的长度,只不过在最终的统计结果时,选nums[0]取DP数组的first[nums.length - 1], 而选nums[nums.length],则取DP数组中的second[nums.length]。
另外,因为是I的延伸题,I中所运用的DP可以被复用,只需要设定起始点和终点,那么问题II,就可以直接拆解为两个不同起始点和终点的问题I。
【参考答案】