class Solution {
public:
int rob(vector<int>& nums) {
if(nums.size() <= 0){
return 0;
}
if(nums.size() == 1){
return nums[0];
}
if(nums.size() == 2){
return max(nums[0], nums[1]);
}
int n = nums.size();
//把问题分解成是否打劫第一家
//打劫了第一家,则不能打劫最后一家
return max(robRange(nums, 0, n-2),
robRange(nums, 1, n-1));
}
int robRange(vector<int>& nums, int start, int end){
int dp_i = 0;
int dp_i_2 = 0;
int dp_i_1 = 0;
// for(int i = end; i>= start; i--){
// dp_i = max(dp_i_1, dp_i_2 + nums[i]);
// dp_i_2 = dp_i_1;
// dp_i_1 = dp_i;
// }
// 采用自底向上的方式计算,能够减少内存消耗
for(int i = start ; i<= end; i++){
dp_i = max(dp_i_1, dp_i_2 + nums[i]);
dp_i_2 = dp_i_1;
dp_i_1 = dp_i;
}
return dp_i;
}
};