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. vector<int> dp(nums.size() + 1, 0);
  14. dp[1] = nums[0];
  15. dp[2] = max(nums[0], nums[1]);
  16. for(int i = 3; i <= nums.size(); i++){
  17. // 偷不偷第i个房屋,偷的话则是dp[i -2] + nums[i-1]
  18. // 不偷的话,则是dp[i - 1]
  19. // 所以状态转移方程为 dp[i] = max(dp[i - 1], dp[i -2] + nums[i-1])
  20. dp[i] = max(dp[i - 1], dp[i -2] + nums[i-1] );
  21. }
  22. return dp[nums.size()];
  23. }
  24. };

优化版本

  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 dp0 = nums[0];
  14. int dp1 = max(nums[0], nums[1]);
  15. int dp2 = 0;
  16. for(int i = 3 ; i<= nums.size(); i++){
  17. dp2 = max(dp1, dp0 + nums[i-1]);
  18. dp0 = dp1;
  19. dp1 = dp2;
  20. }
  21. return dp2;
  22. }
  23. };