「动态规划」打家劫舍的变形题,你会做吗?

news2024/11/24 16:24:55

213. 打家劫舍 IIicon-default.png?t=N7T8https://leetcode.cn/problems/house-robber-ii/description/

你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,今晚能够偷窃到的最高金额。

  1. 输入:nums = [2,3,2],输出:3,解释:你不能先偷窃1号房屋(金额 = 2),然后偷窃3号房屋(金额 = 2), 因为他们是相邻的。
  2. 输入:nums = [1,2,3,1],输出:4,解释:你可以先偷窃1号房屋(金额 = 1),然后偷窃3号房屋(金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4。
  3. 输入:nums = [1,2,3],输出:3。

提示:1 <= nums.length <= 100,0 <= nums[i] <= 1000。


本题在打家劫舍问题的基础上,加上了首尾相连的条件。解决本题的关键在于如何处理首尾相连的条件。假设有n个房屋。这里,我们根据偷不偷0位置的房屋,进行分类讨论:

  • 如果偷了0位置的房屋,那么就不能偷1位置和n - 1位置的房屋,此时问题转换为:房屋区间为[2, n - 2]的不含首位相连条件的打家劫舍问题。
  • 如果不偷0位置的房屋,此时问题转换为:房屋区间为[1, n - 1]的不含首位相连条件的打家劫舍问题。

而最终的结果,应该是这两种情况的较大值。好了,此时我们只需要解决不含首尾相连条件的打家劫舍问题。我们用动态规划的思想来解决这个问题,以下的讨论都不含首尾相连的条件。

确定状态表示:根据经验和题目要求,我们用dp[i]表示,考虑完i位置的房屋后,此时能偷到的最高金额。这又细分为:

  • 用f[i]表示:必须偷i位置的房屋,此时能偷到的最高金额
  • 用g[i]表示:不能偷i位置的房屋,此时能偷到的最高金额

推导状态转移方程:我们分别考虑2种情况中最近的一步,即是否偷i - 1位置的房屋。

  • 考虑f[i],由于必须偷i位置的房屋,所以不能偷i - 1位置的房屋。偷完i位置的房屋之后,能偷到的最高金额,就等于不能偷i - 1位置的房屋之后能偷到的最高金额加上i位置的房屋的金额,即f[i] = g[i - 1] + nums[i]。
  • 考虑g[i],由于不能偷i位置的金额,所以此时能偷到的最高金额就等于考虑完i - 1位置的房屋后能偷到的最高金额。由于不确定是否偷i - 1位置的房屋,所以结果是偷或者不偷i - 1位置的房屋这2种情况中,能偷到的最高金额的较大值,即g[i] = max(f[i - 1], g[i - 1])。

综上所述,f[i] = g[i - 1] + nums[i],g[i] = max(f[i - 1], g[i - 1])

初始化:根据状态转移方程,在填写f[0]和g[0]时,会发生越界访问,所以要对其初始化。

  • 如果必须偷0位置的房屋,那么此时能偷到的最高金额就是0位置的房屋的金额,即f[0] = nums[0]。
  • 如果不能偷0位置的房屋,那么此时能偷到的最高金额就是0,即g[0] = 0。

综上所述:f[0] = nums[0],g[0] = 0

填表顺序:根据状态转移方程,f[i]依赖于g[i - 1],g[i]依赖于f[i - 1]和g[i - 1],所以应从左往右同时填f表和g表

返回值:我们要求的是考虑完n - 1位置的房屋后,此时能偷到的最高金额,由于并不确定是否偷n - 1位置的房屋,所以结果是偷或者不偷n - 1位置的房屋这2种情况中,能偷到的最高金额的较大值,即max(f[n - 1], g[n - 1])

细节问题:回归题目本身。假设对于没有首尾相连条件的打家劫舍问题中,房屋区间是[left, right],能偷到的最高金额是rob(nums, left, right)。那么,最终的结果就是文章开头提到的2种情况的较大值,即max(nums[0] + rob(nums, 2, n - 2), rob(nums, 1, n - 1))。注意到下标几乎覆盖了整个nums数组,所以为了简单起见,我们把dp表的规模设置成和nums相同,即1 x n。此时,应初始化f[left] = nums[left],g[left] = 0,填表时应从left + 1位置开始一直填到right位置,最终应该返回max(f[right], g[right])

时间复杂度:O(N),空间复杂度:O(N)。

class Solution {
public:
    int rob(vector<int>& nums) {
        int n = nums.size();

        // 偷或者不偷0位置的房屋,这2种情况的较大值
        return max(nums[0] + rob(nums, 2, n - 2), rob(nums, 1, n - 1));
    }

private:
    // 不含首尾相连条件的打家劫舍问题,房屋区间为[left, right]
    int rob(vector<int>& nums, int left, int right) {
        // 区间不存在
        if (left > right) {
            return 0;
        }

        int n = nums.size();

        // 创建dp表
        vector<int> f(n);
        auto g = f;

        // 初始化
        f[left] = nums[left];

        // 填表
        for (int i = left + 1; i <= right; i++) {
            f[i] = g[i - 1] + nums[i];
            g[i] = max(f[i - 1], g[i - 1]);
        }

        // 返回结果
        return max(f[right], g[right]);
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1806287.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ Easyx案例实战:Cookie Maker工作室1.0V

前言 //制作属于自己的工作室&#xff01; 注&#xff1a;运行效果以及下载见Cookie Maker 工作室成立程序。 关于Cookie Maker工作室成立的信息&#xff0c;I am very happy&#xff08;唔……改不过来了&#xff09;。 OKOK&#xff0c;第一次用图形库写程序&#xff08;图形…

基于Simulink的双端行波测距

1 输电线路故障仿真模型 基于双端行波测距理论&#xff0c;在MATLAB软件中搭建的三相50Hz的输电线路故障仿真模型如图1所示&#xff0c;该模型包含了三相电源、输电线路、故障发生器和示波器模块等。主要仿真参数设置如下:仿真时间为 0~0.1s,采用固定步长 10-7和ode3 算法&…

knoXSS(case01~10)

case 01: 先在每个框里都输入:<script>alert(1)</script> 检查源码 这里第三个和第四个点都被处理过了&#xff0c;所以先考虑第一个和第二个点 这里试了一下&#xff0c;发现GET也能传参&#xff0c;所以构造 成功 case 02: 这里发现变量a和这个似乎有关联&…

【C语言】Leetcode-312 戳气球

文章目录 题目思路代码如下 题目 链接: Leetcode-312 戳气球 思路 我们观察戳气球的操作&#xff0c;发现这会导致两个气球从不相邻变成相邻&#xff0c;使得后续操作难以处理。于是我们倒过来看这些操作&#xff0c;将全过程看作是每次添加一个气球。 首先 我们需要创建一个…

社交“学习伙伴”:Meta Llama助力对话升级

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【数据结构】排序——插入排序,选择排序

前言 本篇博客我们正式开启数据结构中的排序&#xff0c;说到排序&#xff0c;我们能联想到我之前在C语言博客中的冒泡排序&#xff0c;它是排序中的一种&#xff0c;但实现效率太慢&#xff0c;这篇博客我们介绍两种新排序&#xff0c;并好好深入理解排序 &#x1f493; 个人主…

HCIA--NAT地址转换(复习)

先交换后路由&#xff1a; 1&#xff1a;在交换机上创建vlan&#xff0c;进入接口划分vlan&#xff0c;接着在交换机连接路由器的接口上建立trunk干道 2&#xff1a;在路由器上&#xff0c;先配置物理接口IP&#xff0c;接着在路由器上创建两个子接口&#xff0c;将建立的vla…

100道面试必会算法-32-二叉树右视图用栈实现队列

100道面试必会算法-32-二叉树右视图&用栈实现队列 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出: [1,3,4]示例 2: 输入: [1,n…

powershell:使用IProgressDialog接口创建windows标准进度对话框。

禁止任何形式的抄录&#xff0c;转载请附上本文章地址 Add-Type using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Runtime.InteropServices; // 定义ProgressDialog类&#xff0c;实现IProgressDialog接口 …

数据库之PostgreSQL详解

一、PostgreSQL介绍 PostgreSQL是一个功能强大的 开源 的关系型数据库。底层基于C实现。 PostgreSQL的开源协议和Linux内核版本的开源协议是一样的。。BDS协议&#xff0c;这个协议基本和MIT开源协议一样&#xff0c;说人话&#xff0c;就是你可以对PostgreSQL进行一些封装&a…

K210视觉识别模块学习笔记5:(嘉楠)训练使用模型_识别人脸

今日开始学习K210视觉识别模块:(嘉楠)训练与使用模型_识别人脸 亚博智能的K210视觉识别模块...... 固件库版本: canmv_yahboom_v2.1.1.bin 之前的训练网址部署模型时需要我们自己更换固件&#xff0c;而且还不能用亚博的图像操作库函数了&#xff0c;这十分不友好&#xff0…

vue3关于配置代码检查工作流,husky出现创建错误问题的解决方法

关于配置代码检查工作流&#xff0c;husky出现error: cant create hook, .husky directory doesnt exist (try running husky install) 首先根据截图发现最明显的信息是error&#xff0c;中文译为-----错误&#xff1a;无法创建钩子&#xff0c;.husky 目录不存在&#xff08;尝…

【数据结构】十二、八种常用的排序算法讲解及代码分享

目录 一、插入排序 1)算法思想 2&#xff09;代码 二、希尔排序 1&#xff09;算法思想 2&#xff09;代码 三、选择排序 1&#xff09;算法思想 2&#xff09;代码 四、堆排序 1&#xff09;什么是最大堆 2&#xff09;如何创建最大堆 3&#xff09;算法思想 4&a…

Databricks Data Warehouse

Warehouse features 原来的data warehouse痛点&#xff1a; 用例不兼容的支持模型的安全和管理不兼容不相交和重复的数据 ETL workloads Streaming Architecture Data Science and ML

演讲全文|林涛:MongoDB助力智能制造出海控本增效

5月29日-30日在上海世博中心举办的亚马逊云科技中国峰会圆满结束。本文整理了MongoDB北亚区方案与咨询总监林涛在白金讲堂的演讲全文&#xff0c;就《MongoDB助力智能制造出海控本增效》话题与大家共同探讨。 白金讲堂演讲视频 从全球经济竞争的角度看&#xff0c;中国制造业…

原来你长这个样子啊,Java字节码文件

字节码文件 字节码文件是一种二进制文件&#xff0c;扩展名为.class 通过 javac 将源码编译得到&#xff0c;是一种中间形式的代码&#xff0c;这种中间形式的代码让Java有了“一次编译&#xff0c;多次运行”的跨平台特点。 字节码文件的组成 由5大组成部分&#xff1a;基础…

【SQLAlChemy】如何连接数据库?

使用SQLAlChemy连接数据库 导入包 首先&#xff0c;导入创建数据库引擎的包。 from sqlalchemy import create_engine编写数据库配置 SQLALCHEMY_DATABASE_URL "mysql://root:123456789127.0.0.1:3306/tortoise"字段解释&#xff1a; mysql:&#xff1a;这是数…

Python第二语言(七、Python模块)

目录 1. 什么是模块 2. 基本语法 2.1 模块的导入方式 2.2 基本语法 import 模块名 2.3 基本语法 from 模块名 import 功能名 2.4 基本语法as 别名 3. 自定义模块 4. 调用自定义模块时&#xff0c;如何让其模块中的函数不被调用&#xff08;__name__&#xff09; 5. 调…

fl studio怎么设置中文及 2024年最新fl studio选购指南

FL Studio让你的计算机就像是全功能的录音室&#xff0c;漂亮的大混音盘&#xff0c;先进的创作工具&#xff0c;让你的音乐突破想象力的限制。zol提供FL Studio中文版下载。 FL Studio中文版下载软件简介 FL Studio 让你的计算机就像是全功能的录音室&#xff0c;漂亮的大混…

Linux的网络配置

查看网络配置命令 一、查看所有活动的网络接口信息 ifconfig ifconfig 展示的是当前设备正在工作的网卡&#xff08;启动的设备&#xff09; ifconfig -a 展示所有的网络设备 ifconfig ens33 查看指定网卡设备 ifconfig ens33 down 关闭网卡 或者 ifdown ens33 &#xff0…