欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

LeetCode 198.打家劫舍

程序员文章站 2022-03-07 19:44:37
...

一,问题描述

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];         //返回最大值
    }
};