五部曲和打家劫舍一样,不同点在于该题首部和尾部只有一个能选(或者都不选)。
题解:
class Solution {
public:
int rob(vector<int>& nums) {
//打家劫舍 II
//dp[j]:j以内的房屋 最高可以偷到的金额为dp[j]
//dp[j] = max(dp[j-1],dp[j-2]+nums[j])
//考虑特殊情况
if(nums.size() == 1){
return nums[0];
}
//首部和尾部只有一个能选
//不选尾部
int result1 = robRange(nums,0,nums.size()-2);
//不选首部
int result2 = robRange(nums,1,nums.size()-1);
return max(result1,result2);
}
int robRange(vector<int> &nums,int start,int end){
if(start == end){
return nums[start];
}
//定义dp数组
vector<int> dp(nums.size());
dp[start] = nums[start];
dp[start+1] = max(nums[start],nums[start+1]);
//计算dp
for(int j = start+2;j<nums.size();j++){
dp[j] = max(dp[j-1],dp[j-2]+nums[j]);
// cout<<dp[j]<<" ";
}
return dp[end];
}
};