题意:在House Robber的基础上做了一点修改,给出的数不是一位数组而是组成了一个环。
分析:方法同House Robber。考虑组成环之后的数,选中第一个数,最后一个数就不能再选了,综合数组nums[0,n-2]和nums[2,n-1]选较大者则为问题答案。
代码:
class Solution {
public:
int rob(vector<int>& nums) {
int n=nums.size();
if(n==0) return 0;
if(n==1) return nums[0];
vector<int> dp1(n-1,0);
dp1[0]=nums[0];
dp1[1]=max(nums[0],nums[1]);
for(int i=2;i<n-1;++i) dp1[i]=max(dp1[i-1],dp1[i-2]+nums[i]);
vector<int> dp2(n-1,0);
dp2[0]=nums[1];
dp2[1]=max(nums[1],nums[2]);
for(int i=3;i<n;++i) dp2[i-1]=max(dp2[i-2],dp2[i-3]+nums[i]);
return max(dp1[n-2],dp2[n-2]);
}
};