LeetCode—House Robber 寻找数组不相邻组合最大值DP

该博客探讨了LeetCode中的House Robber问题,即如何找到数组中不相邻元素的最大组合和。通过举例说明了如何利用动态规划策略,从数组中的每个元素出发,计算连续不抢劫的最大收益。最终实现了一个简洁的解决方案,通过两个变量跟踪选择抢劫和不抢劫的状态,以确定最大总和。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://leetcode.com/problems/house-robber/

题目设计了一个抢劫犯的情景,其实就是求数组中不相邻数据进行组合得到的最大值

举一个例子

假设数据: 8 3 6 15 4 9 7 10

那么首先可能选取 8 , 3

每一个数字的选取都是根据他的前两个数字,前三个数字得到的最大值进行选择,等到6的时候考虑前面只能和8组合  8,3,14

到数字15,那么就可以考虑在8,3中进行组合  8,3,14,23,4,9,7,10

接下来的步骤:

8,3,14,23,18,9,7,10

8,3,14,23,18,32,7,10

8,3,14,23,18,32,30,10

8,3,14,23,18,32,30,42  最后是42

class Solution {
public:
    int rob(vector<int> &num) {
        if(num.empty())
        {
            return 0;
        }
        int res = 0;
        int length = num.size();
        if(1 == length)
        {
            return num[0];
        }
        if(length >= 3)
        {
            num[2] = num[0]+num[2];
        }
        for(int i = 3; i < length; i++)
        {
            if(num[i-2]>num[i-3])
            {
                num[i] += num[i-2];
            }
            else
            {
                num[i] += num[i-3];
            }
            
        }
        return (num[length-2]>num[length-1])? num[length-2]:num[length-1];
        
    }
};


其实这是一个DP的问题:

A[i][0]表示第i次没有抢劫,A[i][1]表示第i次进行了抢劫

即A[i+1][0] = max(A[i][0], A[i][1])..  那么rob当前的house,只能等于上次没有rob的+money[i+1], 则A[i+1][1] = A[i][0]+money[i+1].

实际上只需要两个变量保存结果就可以了,不需要用二维数组

[cpp]  view plain
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值