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

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.rhkb.cn/news/345202.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT Udp广播实现设备发现

测试环境 本文选用pc1作为客户端&#xff0c;pc2&#xff0c;以及一台虚拟机作为服务端。 pc1,pc2(客户端&#xff09;: 虚拟机&#xff08;服务端)&#xff1a; 客户端 原理&#xff1a;客户端通过发送广播消息信息到ip:255.255.255.255(QHostAddress::Broadcast),局域网…

Tensorflow入门实战 P03-天气识别

目录 1、完整代码 2、运行结果 2.1 查看20张图片 2.2 程序运行 2.3 运行结果 3、小结 ① 代码运行过程中有报错&#xff1a; ② 修改代码如下&#xff1a; ③ 分析原因&#xff1a; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&…

STM32H750启动和内存优化(分散加载修改)

前些日子有个朋友一直给我推荐STM32H750这款芯片&#xff0c;说它的性价比&#xff0c;说它多么多么好。于是乎&#xff0c;这两天试了试&#xff0c;嚯&#xff0c;真香&#xff01;我们先看看基本配置 这里简单总结下&#xff0c;cortex-m7内核&#xff0c;128k片内flash …

k8s挂载配置文件(通过ConfigMap方式)

一、ConfigMap简介 K8s中的ConfigMap是一种用于存储配置数据的API对象&#xff0c;属于Kubernetes中的核心对象。它用于将应用程序的配置信息与容器镜像分离&#xff0c;以便在不重新构建镜像的情况下进行配置的修改和更新。ConfigMap可以存储键值对、文本文件或者以特定格式组…

[Vue-常见错误]浏览器显示Uncaught runtime errors

文章目录 错误描述正确写法具体如下 错误描述 当前端代码发生错误时&#xff0c;浏览器中出现以下错误提示。 正确写法 显然这不是我们所期望的&#xff0c;在vue.config.js中配置如下设置关闭Uncaught runtime errors显示 devServer: {client: {overlay: false}具体如下 …

UltraEditUEStudio软件最新版下载及详细安装教程

UEStudio简介&#xff1a; UEStudio建立在上文本编辑器UltraEdit的功能基础上&#xff0c;并为团队和开发人员提供了其他功能&#xff0c;例如深度Git集成。您可以直接在UEStudio中克隆&#xff0c;签出&#xff0c;更新&#xff0c;提交&#xff0c;推入/拉入等操作&#xff…

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第37课-自动切换纹理

【WEB前端2024】3D智体编程&#xff1a;乔布斯3D纪念馆-第37课-自动切换纹理 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎&…

后台管理系统排序混乱,分页出现重复条例

检查了接口和请求参数都没有问题。 查询数据库发现是排序字段create_time 都相同导致的。没有区分度。 解决方案 按照唯一id排序 避免create_time 大批量相同 order by create_time &#xff0c;xxx 两个排序字段

Python第二语言(五、Python文件相关操作)

目录 1. 文件编码的概念 2. 文件的读取操作 2.1 什么是文件 2.2 open()打开函数 2.3 mode常用的三种基础访问模式 2.4 文件操作及案例 3. 文件的写入操作及刷新文件&#xff1a;write与flush 4. 文件的追加操作 5. 文件操作的综合案例&#xff08;文件备份操作&#x…

推荐4个好用有趣的软件

MyComic——漫画聚合软件 MyComic是一款界面简洁、分类详尽的漫画阅读软件&#xff0c;专为动漫爱好者设计。它提供了丰富的高清漫画资源&#xff0c;支持在线免费阅读&#xff0c;并且可以一键下载到书架&#xff0c;方便随时离线观看&#xff0c;节省流量。用户可以轻松找到喜…

Java多线程-初阶1

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:MySQL数据库 JavaEE专栏:JavaEE 关注博主带你了解更多数据结构知识 1. 认识线程&#xff08;Thread&#xff09; 1.线程是什么 ⼀个线程就是⼀个 "执⾏流". 每个线程之间都可以按照顺序执⾏⾃⼰的代…

Linux——信号

目录 一关于信号 二信号概念 三信号产生 四信号处理 1核心转储 2信号的其它常见概念 3函数实现 五信号捕捉 1捕捉流程 2内核态与用户态 2.1再谈地址空间 2.2键盘输入数据 2.3OS的运行过程 3函数实现 六其它问题 1可重入函数 2.volatile 3SIGCHLD 一关于信号 …

小程序中实现自定义头部导航组件

在页面中实现自定义头部导航的组件&#xff0c;如果仅是单个页面中需要自定义可在页面的json文件中配置"navigationStyle": “custom”&#xff0c;如果是项目中所有页面都想使用自定义的组件&#xff0c;可在app.json的window中全局配置"navigationStyle"…

构建第一个ArkTS应用之@卡片事件能力说明

ArkTS卡片中提供了postCardAction()接口用于卡片内部和提供方应用间的交互&#xff0c;当前支持router、message和call三种类型的事件&#xff0c;仅在卡片中可以调用。 接口定义&#xff1a;postCardAction(component: Object, action: Object): void 接口参数说明&#xff1…

再读高考作文题

新课标I卷&#xff1a;讨论了随着互联网和人工智能的普及&#xff0c;问题是否会变得越来越少&#xff0c;要求考生写一篇文章&#xff0c;表达自己对于这一现象的联想和思考。 从来就没有什么救世主 AI也不是​​​​​ 一直不会写作文&#xff0c;直到高中&#xff0c;才堪堪…

代码随想录算法训练营第二十三天

题目&#xff1a;39. 组合总和 这道题目和组合差不多 集合里元素可以用无数次&#xff0c;那么和组合问题的差别 其实仅在于 startIndex上的控制 还有就是重复的如何进行剔除的方法如何实现 其实出现这个问题是因为没有理解startIndex的作用 详细看视频的 4分钟开始的地方…

易于上手的requests

Python中的requests库主要用于发送HTTP请求并获取响应结果。在现代网络编程中&#xff0c;HTTP请求是构建客户端与服务器之间通信的基础。Python作为一种高级编程语言&#xff0c;其丰富的库支持使得它在网络数据处理领域尤为突出。其中&#xff0c;requests库以其简洁、易用的…

【ArcGIS微课1000例】0117:ArcGIS中如何将kml(kmz)文件转json(geojson)?

文章目录 一、kml获取方式二、kml转图层三、图层转json一、kml获取方式 kml文件是一种很常用的数据格式,可以从谷歌地球(googleearth)获取某一个地区的kml范围文件,如青海湖(做好的kml文件可以从配套实验数据包0117.rar中获取)。 二、kml转图层 打开【KML转图层】工具,…

在Java中使用SeleniumAPI,超详细

Java中 Selenium相关操作 1 定位元素 1.1 css选择器定位元素 就是定位到页面的元素&#xff0c;本质上就是一个一个的语法 下面举几个具体的例子&#xff1a; 类选择器 按照给定的 class 属性的值&#xff0c;选择所有匹配的元素。 语法&#xff1a;.classname 例子&am…

Java Web学习笔记30——打包部署

打包&#xff1a; 到资源管理器中再看下&#xff1a; 将这些文件压缩成一个zip文件&#xff0c;然后到nginx的html目录中执行unzip 解压即可。 部署&#xff1a; Nginx&#xff1a;Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代…