算法6 抢劫

这篇博客讨论了一种算法问题,涉及在不能抢劫相邻房屋的条件下,如何计算出能抢到的最大金额。通过状态转移方程,即sum[i] += Math.max(sum[i-2], sum[i-3]),来决定是否抢劫当前房屋,以避免相邻房屋联动报警,从而求解最大抢劫金额。" 105021293,1433559,Python中的多重继承与super()函数解析,"['Python', '面向对象', '继承', '编程概念']

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

题目:你是一名专业强盗,计划沿着一条街打劫。每间房屋都储存有一定金额的钱,唯一能阻止你打劫的约束条件就是房屋之间有安全系统相连,如果同一个晚上有两间相邻的房屋被闯入,它们就会自动联络警察,因此不可以打劫相邻的房屋。
给出一个表示每个房子的金额的非负整数的列表,确定你今天晚上可以抢救的最大金额,而不提醒警察。
思路:加入int[] sum={1,2,3,4},在不能抢相邻房子的前提下,
4栋房子我们可以最多抢2栋,即挑选出两个加和最大值 ,在int[] sum={1,2,3,4,5},5栋房子时我们可以最多可以抢3栋,但是不见得三栋的的和比抢两栋的钱数多。所以要找最大值,又要不相邻,我们需要用到用状态转移方程:sum[i] += Math.max(sum[i-2], sum[i-3]); 即抢第四栋房子时,要在去除抢第一栋或抢第二栋时的最大值。(这个的sum[i-2],并不是那个i-2索引的值而是通过状态转移方程求出的和)。
代码

public static int robber(int[] sum){
    if (sum== null || sum.length == 0) {
        return 0;
    }
    //如果只有一个元素,返回这个元素值
    if(sum.length==1){
        return sum[0];
    }
    else if(sum.length==2){
        //如果有两个元素,返回其中较大的值
        return Math.max(sum[0], sum[1]);
    }else if(sum.length==3){
        //如果有三个元素,比较第一个元素和第三个元素之和与第二个元素的值,返回较大者
        return Math.max(sum[0]+sum[2], sum[1]);
    }
    //把第一个和第三个元素的和赋给第三个元素,以便以后比较
    if (sum.length > 3) {
        sum[2] += sum[0];
    }
    //从第四个元素开始处理就需要用到公式了,也是从第四个开始重新赋值,元素少于
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值