一、题目
二、思路
1、收尾不能同时拿,那就分成两部分
2、一部分为0-n-2,第二部分为1-n-1,取两者的最大值
3、每部分求解与之前的打家劫舍一样
三、代码
class Solution {
public:
int rob(vector<int>& nums) {
int size=nums.size();
if(size==0)
{
return 0;
}
else if(size==1)
{
return nums[0];
}
else if(size==2)
{
return max(nums[0],nums[1]);
}
//选择第一间房屋
int x=first_num(nums,0,size-2);
int y=first_num(nums,1,size-1);
return max(x,y);
}
int first_num(vector<int>& nums,int left,int right)
{
if(left>right)
{
return 0;
}
vector<int>dp(right-left+1,0);
dp[0]=nums[left];
dp[1]=max(nums[left],nums[left+1]);
for(int i=left+2;i<=right;++i)
{
dp[i-left]=max(dp[i-left-2]+nums[i],dp[i-left-1]);
}
return dp[right-left];
}
};