问题描述
该题就是在打家劫舍1的基础上增加了一个条件,就相当于求两次打家劫舍1,因为要想偷得钱最多,就要分两种情况:在第一个和最后一个中选择哪个(两个都不选的舍去,那肯定不是最大的)偷到的钱是最多的;
代码
class Solution {
public:
int f(vector <int> &nums,int s,int e)//相当于打家劫舍1
{
vector <int> dp(nums.size());
dp[s]=nums[s];
dp[s+1]=max(nums[s],nums[s+1]);
for(int i=s+2;i<=e;i++) {
for(int j=s;j<=i;j++) {
dp[i]=max(nums[j]+dp[i-2],dp[i-1]);//偷还是不偷
}
}
return dp[e];
}
int rob(vector<int>& nums) {
int n=nums.size();
if(n==0) return 0;
if(n==1) return nums[0];
if(n==2) return max(nums[0],nums[1]);
int a=f(nums,0,n-2);//选第一个
int b=f(nums,1,n-1);//选第二个
return max(a,b);
}
};