LeetCode 213. House Robber II

本文探讨了在环形排列的房屋中进行抢劫的问题,这是一种扩展的House Robber问题。文章详细分析了两种情况下的最优策略,即抢劫第一个房屋和不抢劫第一个房屋,并通过动态规划算法求解最大收益。

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

Note: This is an extension of House Robber.

After robbing those houses on that street, the thief has found himself a new place for his thievery so that he will not get too much attention. This time, all houses at this place are arranged in a circle. That means the first house is the neighbor of the last one. Meanwhile, the security system for these houses remain the same as for those in the previous street.

Given a list of non-negative integers representing the amount of money of each house, determine the maximum amount of money you can rob tonight without alerting the police.

分析

这道题其实也不难,与 House Robber I相比只要分两种情况就可以了,第一种情况是rob first house,则第二个house和最后一个house肯定不能rob了。第二种情况是not to rob first house,则第二个house和最后一个house可以rob。用动态规划,rob,和notrob分别表示抢劫和不抢劫某个house对应的最大值,动态转移方程是rob=notrob(上一个house)+nums[i], notrob=max ( rob(上一个house) , notrob(上一个house) )。

粗鲁的分类写法

class Solution {
public:
    int rob(vector<int>& nums) {
        if(nums.size()==0) return 0;
        //situation 1 rob first house
        int rob,notrob;
        rob=notrob=nums[0];
        int temp=nums[0];
        for(int i=2;i<nums.size()-1;i++){
            rob=notrob+nums[i];
            notrob=temp;
            temp=max(rob,notrob);
        }
        int max1=max(rob,notrob);
        //situation 2 not rob first house
        rob=notrob=temp=0;
        for(int i=1;i<nums.size();i++){
            rob=notrob+nums[i];
            notrob=temp;
            temp=max(rob,notrob);
        }
        int max2=max(rob,notrob);
        return max(max1,max2);
    }
};

知性的调用函数写法
···
class Solution {
public:
int help(vector& nums,int s,int e){
int rob=0,notrob=0,temp=0;
for(int i=s;i<e;i++){
rob=notrob+nums[i];
notrob=temp;
temp=max(rob,notrob);
}
return temp;
}
int rob(vector& nums) {
if(nums.size()==0) return 0;
return max(help(nums,2,nums.size()-1)+nums[0],help(nums,1,nums.size()));
}
};
···

转载于:https://www.cnblogs.com/A-Little-Nut/p/10058563.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值