1. class Solution {
    2. public:
    3. int rob(vector<int>& nums) {
    4. if(nums.size() <= 0){
    5. return 0;
    6. }
    7. if(nums.size() == 1){
    8. return nums[0];
    9. }
    10. if(nums.size() == 2){
    11. return max(nums[0], nums[1]);
    12. }
    13. int n = nums.size();
    14. //把问题分解成是否打劫第一家
    15. //打劫了第一家,则不能打劫最后一家
    16. return max(robRange(nums, 0, n-2),
    17. robRange(nums, 1, n-1));
    18. }
    19. int robRange(vector<int>& nums, int start, int end){
    20. int dp_i = 0;
    21. int dp_i_2 = 0;
    22. int dp_i_1 = 0;
    23. // for(int i = end; i>= start; i--){
    24. // dp_i = max(dp_i_1, dp_i_2 + nums[i]);
    25. // dp_i_2 = dp_i_1;
    26. // dp_i_1 = dp_i;
    27. // }
    28. // 采用自底向上的方式计算,能够减少内存消耗
    29. for(int i = start ; i<= end; i++){
    30. dp_i = max(dp_i_1, dp_i_2 + nums[i]);
    31. dp_i_2 = dp_i_1;
    32. dp_i_1 = dp_i;
    33. }
    34. return dp_i;
    35. }
    36. };