leetcode - 213. 打家劫舍 II

在这里插入图片描述
解题思路:这道题是“打家劫舍I”的升级版,和“打家劫舍I”的区别在于“打家劫舍II”的第一个房子和最后一个房子是相连的,这就导致不能用“打家劫舍I”的方法来解题。为了解决“打家劫舍II”中的相连问题,这里讨论两种情况,第一种情况是仅考虑第1个房子到n-1个房子能够窃取的最大的金额,第二种情况是讨论第2个房子到第n个房子能够窃取的最大的金额,然后比较两者之间的取值,返回较大的取值。其状态转移方程和“打家劫舍I”是一样的,区别在于这里讨论的是两种情况。其C++代码如下:

class Solution {
public:
    int rob(vector<int>& nums) {
        int length = nums.size();
        if(length==0)
            return 0;
        if(length==1)
            return nums[0];
        vector<int> dp_1(length,0);
        vector<int> dp_n(length,0);
        dp_1[1] = nums[0];
        dp_n[1] = nums[1];
        int num_1 = dp_1[1];
        int num_n = dp_n[1];
        for(int i=1;i<length-1;i++)
        {
            dp_1[i+1] = max(dp_1[i],dp_1[i-1] + nums[i]);
            num_1 = max(num_1,dp_1[i+1]);
        }
        for(int i=2;i<length;i++)
        {
            dp_n[i] = max(dp_n[i-1],dp_n[i-2] + nums[i]);
            num_n = max(num_n,dp_n[i]);
        }
        return max(num_1,num_n);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值