题目来源http://www.lintcode.com/zh-cn/problem/house-robber-ii/
题目描述
所有的房子围成了一个圈,这就意味着第一间房子和最后一间房子是挨着的。每个房子都存放着特定金额的钱。你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自动报警。
给定一个非负整数列表,表示每个房子中存放的钱, 算一算,如果今晚去打劫,在不触动报警装置的情况下,你最多可以得到多少钱 。
解决方法 = 动态规划
House Robber I的升级版,只不过又增加了一个新的约束条件:第一个元素和最后一个元素不能同时使用。
因为第一个和最后一个元素不能同时出现,所以可看成求解两次House Robber I,即
- 有第一个元素,没有最后一个元素;
- 没有第一个元素,有最后一个元素;
两者的最大值即为所求
代码
class Solution {
public:
/**
* @param nums: An array of non-negative integers.
* return: The maximum amount of money you can rob tonight
*/
int houseRobber2(vector<int>& nums) {
// write your code here
int size = nums.size();
if (size == 0) {
return 0;
}
if (size == 1) {
return nums[0];
}
if (size == 2) {
return max(nums[0], nums[1]);
}
int r1 = houseRobber1(nums, 0, size - 2);
int r2 = houseRobber1(nums, 1, size - 1);
return max(r1, r2);
}
int houseRobber1(vector<int>& nums, int left, int right) {
if (left == right) {
return nums[left];
}
if ((right - left) == 1) {
return max(nums[left], nums[right]);
}
int n1 = nums[left];
int n2 = max(nums[left], nums[left + 1]);
int n3, n4;
left += 2;
while (left <= right) {
n3 = n1 + nums[left];
n4 = max(n2, n3);
n1 = n2;
n2 = n4;
left++;
}
return max(n1, n2);
}
};
请尊重作者的劳动,转载请注明作者及原文地址(http://blog.csdn.net/lis_12/article/details/55212576).
如果觉得本文对您有帮助,请点击‘顶’支持一下,您的支持是我写作最大的动力,谢谢。