題目鏈接: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]);
}
};