解法:动态规划
两次动态规划,分别不访问第一家和最后一家
class Solution {
public:
int rob(vector<int>& nums) {
if(nums.empty())
return 0;
if(nums.size()==1)
return nums[0];
int n=nums.size();
vector<int> dp(n);
if(n==2)
return max(nums[0],nums[1]);
dp[0]=nums[0]; //不访问最后一家
dp[1]=max(nums[0],nums[1]);
for(int i=2;i<n-1;i++)
dp[i]=max(dp[i-1],dp[i-2]+nums[i]);
int res=dp[n-2];
dp[1]=nums[1]; //不访问第一家,n>2
dp[2]=max(nums[1],nums[2]);
for(int i=3;i<n;i++)
dp[i]=max(dp[i-1],dp[i-2]+nums[i]);
return max(res,dp[n-1]);
}
};