这题与leetcode#198相似,只是升级为环形房屋,也就是第一个和最后一个也是相邻的。回顾一下简单版解决方案:
class Solution {//leetcode#198代码
public:
int rob(vector<int>& nums) {
if(nums.empty()) return 0;
vector<int> dp(nums.size(),0);
dp[0]=nums[0];
for(int i=1;i<nums.size();i++)
{
int use_i = i>=2?dp[i-2]+nums[i]:nums[i];
int not_i = dp[i-1];
dp[i] = max(use_i,not_i);
}
return dp[nums.size()-1];
}
};
环形的屋,也就是说打劫第一家,就不能打劫最后一家,打劫最后一家就不能打劫第一家,因此分两次求最大值,然后整体求最大值。
class Solution {
public:
int rob(vector<int>& nums) {
if(nums.empty()) return 0;
if(nums.size()==1) return nums[0];
vector<int> dp(nums.size(),0);
dp[0]=nums[0];
int res=0;
for(int i=1;i<nums.size()-1;i++){
int use_i = i>=2?dp[i-2]+nums[i]:nums[i];
int no_i = dp[i-1];
dp[i] = max(use_i,no_i);
}
res = dp[nums.size()-2];
dp[0]=0;
for(int i=1;i<nums.size();i++){
int use_i = i>=2?dp[i-2]+nums[i]:nums[i];
int no_i = dp[i-1];
dp[i] = max(use_i,no_i);
}
res = max(res,dp[nums.size()-1]);
return res;
}
};