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; }};