leetcode-213. 打家劫舍 II

这篇博客探讨了一个经典的动态规划问题——打家劫舍。作者提供了详细的思路解析,分为两部分分别处理不能同时拿首尾两家的情况。代码实现中,`first_num` 函数递归地计算在不拿首尾两家时的最大收益,最终返回两个部分中的最大值作为整体解决方案。
摘要由CSDN通过智能技术生成

一、题目

在这里插入图片描述

二、思路

1、收尾不能同时拿,那就分成两部分
2、一部分为0-n-2,第二部分为1-n-1,取两者的最大值
3、每部分求解与之前的打家劫舍一样

三、代码

class Solution {
public:
    int rob(vector<int>& nums) {
        int size=nums.size();
        if(size==0)
        {
            return 0;
        }
        else if(size==1)
        {
            return nums[0];
        }
        else if(size==2)
        {
            return max(nums[0],nums[1]);
        }
        //选择第一间房屋
        int x=first_num(nums,0,size-2);
        int y=first_num(nums,1,size-1);
        return max(x,y);
    }
    int first_num(vector<int>& nums,int left,int right)
    {
        if(left>right)
        {
            return 0;
        }
        vector<int>dp(right-left+1,0);
        dp[0]=nums[left];
        dp[1]=max(nums[left],nums[left+1]);
        for(int i=left+2;i<=right;++i)
        {
            dp[i-left]=max(dp[i-left-2]+nums[i],dp[i-left-1]);
        }
        return dp[right-left];
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值