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.
因为第一个数和最后一个数不能同时选,因此需要做两次dp,第一次不选第一个数,第二次选第一个数,然后取两次结果的较大值。
代码1:
class Solution {
public:
int rob(vector<int>& nums) {
int i, n = nums.size();
vector<int>table (nums.size()+1, 0);
if (n == 0) return 0;
if (n == 1) return nums[0];
//第一遍
table[2] = nums[1];
for (i = 2; i < n; ++i) {
table[i+1] = max(table[i], table[i-1]+nums[i]);
}
//第二遍
table[1] = nums[0];
for (i = 1; i < n-1; ++i) {
table[i+1] = max(table[i], table[i-1]+nums[i]);
}
return max(table[n-1], table[n]);
}
};
代码2:
class Solution {
public:
int rob(vector<int>& nums) {
int i, pre, cur, tmp, result, n = nums.size();
if (n == 0) return 0;
if (n == 1) return nums[0];
//第一遍
pre = 0;
cur = nums[1];
for (i = 2; i < n; ++i) {
tmp = cur;
cur = max(pre+nums[i], cur);
pre = tmp;
}
result = cur;
//第二遍
pre = 0;
cur = nums[0];
for (i = 1; i < n-1; ++i) {
tmp = cur;
cur = max(pre+nums[i], cur);
pre = tmp;
}
return max(result, cur);
}
};