题目链接:leetcode213
思路:在之前的基础上加上环的约束,可以特判第一个选与不选,最后把两个方向的最终状态取个最大返回。
class Solution {
public:
int rob(vector<int>& nums) {
int n=nums.size();
if(n==0) return 0;
if(n==1) return nums[0];
int dp1[n+1]={0}, dp2[n+1]={0}; //偷第一个和不偷第一个
dp1[1] = nums[0];
for(int i=2; i<n; ++i) dp1[i]=max(dp1[i-2]+nums[i-1], dp1[i-1]);
dp2[1] = 0;
for(int i=2; i<=n; ++i) dp2[i]=max(dp2[i-2]+nums[i-1], dp2[i-1]);
return max(dp1[n-1], dp2[n]);
}
};