LeetCode198. 打家劫舍

用dp[i]表示打劫到第i个房子(i从0开始)时能获取到的最高金额,显然对于第i个房子,我们有打劫和不打劫两种方案。

如果不打劫第i个房子,那么到第i个房子能获取的最高金额和到第i - 1个房子能获取到的最高金额是一样的(因为到了第i个房子这里没有收入嘛)。因此我们有dp[i] = dp[i - 1];

如果打劫第i个房子,那么到第i个房子能获取到的最高金额就是到第i - 2个房子能获取到的最高金额加上打劫第i个房子获得的收入(因为不能连着打劫,所以是第i - 2个房子)。因此我们有dp[i] = dp[i - 2] + nums[i];

但是对于一个房子,我们不知道最佳方案里是否要打劫这个房子,所以对于两种方案取最大值,就是当前的最高金额了。

最后的返回值就是打劫到最后一个房子能获取到的最高金额。

class Solution {
public:
    int rob(vector<int>& nums) {
        if(nums.size() == 0) {
            return 0;
        } 
        if(nums.size() == 1) {
            return nums[0];
        }
        vector<int> dp(nums.size());
        dp[0] = nums[0], dp[1] = max(nums[0], nums[1]);
        for(int i = 2; i < nums.size(); ++i) {
            dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);
        }
        return dp[nums.size() - 1];
    }
};
posted @ 2020-08-04 16:04  machine_gun_lin  阅读(69)  评论(0编辑  收藏  举报