LeetCode 198.打家劫舍

一,问题描述

二,问题分析

       每一间房屋你都有偷或者不偷两种选择,且不可偷相邻的房屋,从最后一项开始分析,到最后一间房子n能够的最大金额有两个来源,一是不偷最后一间房屋,得到前n-1项房屋的最大值,二是偷最后一间房屋那么就不偷第n-1的房屋,那么最大金额就是前 n-2间房屋的最大值加上偷最后一间房屋的金额。两种情况取最大值即可,很明显满足最优子结构。

1.定义状态 dp[i] :表示0-i所房屋能够偷取的最大值

2.初始状态:dp[0] = nums[0];

                     dp[1] = max(nums[0],nums[1]);

2.状态转移:dp[i] = max(dp[i-1],dp[i-2]+nums[i]);

三,问题解答

class Solution {
public:
    int rob(vector<int>& nums) {
    //dp[i] : 表示前 i 个房屋能够获得的最大值
    int len = nums.size();
    if(len == 0){        //输入情况是空即 nums = [];
        return 0;
    }
    if(len == 1){        //输入情况只有一个房屋即 nums = [ i ];
        return nums[0];
    }
    vector<int> dp(len);
    dp[0] = nums[0];            //初始状态
    dp[1] = max(nums[0],nums[1]);
    for(int i=2;i<len;i++){        //状态转移
        dp[i] = max(dp[i-1],dp[i-2]+nums[i]);
    }
    return dp[len-1];         //返回最大值
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章