在上次打劫完一条街道之后,窃贼又发现了一个新的可以打劫的地方,但这次所有的房子围成了一个圈,这就意味着第一间房子和最后一间房子是挨着的。每个房子都存放着特定金额的钱。你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自动报警。
给定一个非负整数列表,表示每个房子中存放的钱, 算一算,如果今晚去打劫,在不触动报警装置的情况下, 你最多可以得到多少钱 。
这题是House Robber的扩展,只不过是由直线变成了圈
样例
样例1
输入: nums = [3,6,4]
输出: 6
样例2
输入: nums = [2,3,2,3]
输出: 6
long long houseRobber(vector<int> &a) {
// write your code here
vector<long long>dp(a.size(), 0);
if (a.size() == 0)
{
return 0;
}
else if (a.size() == 1)
{
return a[0];
}
else if (a.size() == 2)
{
return max(a[0], a[1]);
}
dp[0] = a[0];
dp[1] = a[1];
long long retMax = max(dp[0], dp[1]);
long long second = dp[0];//第二个大
for (int i = 2; i<a.size(); i++)
{
dp[i] = a[i] + second;
second = second > dp[i - 1] ? second : dp[i - 1];
}
retMax = dp[a.size() - 1]>dp[a.size() - 2] ? dp[a.size() - 1] : dp[a.size() - 2];
return retMax;
}
int houseRobber2(vector<int> &nums) {
// write your code here
if (nums.size() == 0)
{
return 0;
}
else if (nums.size() == 1)
{
return nums[0];
}
else if (nums.size() == 2)
{
return max(nums[0], nums[1]);
}
//把第一个去掉
vector<int>tmp = nums;
tmp.erase(tmp.begin());
long long first = houseRobber(tmp);
//把最后一个去掉
tmp = nums;
tmp.erase(tmp.begin()+nums.size()-1);
long long second = houseRobber(tmp);
return first > second ? first : second;
}