[leetcode]打家劫舍

本文探讨了一种利用动态规划解决特定盗窃问题的方法。问题设定为一名小偷试图从一排房屋中偷窃,但相邻房屋有联动报警系统,因此不能连续盗窃。通过建立递推关系,我们展示了如何在不触发报警的情况下最大化盗窃金额。此问题不仅是计算机科学中的经典案例,也是动态规划技巧的实际应用。

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

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警

给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。

/----------分割----------/

这应该是一道比较简单且典型的动态规划问题。

首先要提取出关键信息:如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。即是说,取(tou)1就要舍弃2,欲取2,就得舍弃1。

方法就是使用已有的结果进行后续的计算。

用数组money表示这条街每户家庭的钱,用n表示某家庭在这条街中的位置,用rob数组存储到n为止,能够偷到的钱有多少。在偷第n家时(n>=3),有两种选择:

①偷;

②不偷。

对应的偷盗收益是:

①偷第n家,则第n-1家不能偷,只能从前n-2家中偷取,所以总共偷了money[n]+rob[n-2];

②不偷第n家,则偷盗收益与偷前n-1家时一致,即rob[n-1]

比较这俩值,取较大的即可。

这个方法没法计算出n=2、n=1、n=0。不过显然n=2时为前两家中的较大值,n=1时为第一家的钱,n=0则偷不到钱。

贴上代码:

class Solution {
public:
    int maxNum(int a, int b)
    {
        if (a > b)
            return a;
        return b;
    }
    int rob(vector<int>& nums) {
        if (nums.size() == 0)
        {
            return 0;
        }
        if (nums.size() == 1)
        {
            return nums[0];
        }
        vector<int> rob;
        rob.push_back(nums[0]);
        rob.push_back(maxNum(nums[0], nums[1]));
        for (int i = 2; i < nums.size(); i++)
        {
            rob.push_back(maxNum(rob[i - 2] + nums[i], rob[i - 1]));
        }
        return rob[nums.size()-1];
        }
};

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值