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]);        }        vector<int> dp(nums.size() + 1, 0);        dp[1] = nums[0];        dp[2] = max(nums[0], nums[1]);        for(int i =  3; i <= nums.size(); i++){            // 偷不偷第i个房屋,偷的话则是dp[i -2] + nums[i-1]            // 不偷的话,则是dp[i - 1]            // 所以状态转移方程为 dp[i] = max(dp[i - 1], dp[i -2] + nums[i-1])            dp[i] = max(dp[i - 1], dp[i -2] + nums[i-1] );        }        return dp[nums.size()];    }};
优化版本
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 dp0 = nums[0];        int dp1 = max(nums[0], nums[1]);        int dp2 = 0;        for(int i = 3 ; i<= nums.size(); i++){            dp2 = max(dp1, dp0 + nums[i-1]);            dp0 = dp1;            dp1 = dp2;        }        return dp2;    }};