[动态规划] (十二) 简单多状态 LeetCode 213.打家劫舍II
[动态规划] (十二) 简单多状态: LeetCode 213.打家劫舍II
文章目录
- [动态规划] (十二) 简单多状态: LeetCode 213.打家劫舍II
- 题目解析
- 解题思路
- 状态表示
- 状态转移方程
- 初始化和填表顺序
- 返回值
- 提醒
- 代码实现
- 总结
213. 打家劫舍 II

题目解析
本题是对打家劫舍和按摩师的升级题型,可以看完上一道题再来看下面的内容。
[动态规划] (十一) 简单多状态 LeetCode 面试题17.16.按摩师 和 198.打家劫舍-CSDN博客
(1) 房屋是环绕的,第一个房子和最后一个房子是紧挨着的
(2) 不能连续进入房子
(3) 返回最高金额
解题思路
状态表示
dp[i]:按照以往的经验,以i为结尾可以获得的最高的金额。
dp[i]又可以分为偷到i位置时,进入i房间(f[i])和不进入i房间(g[i])。(详情可以点之前的链接。)
但是本题又不一样,多了个房屋环绕,如图。

由于0号房间和n-1号房间是紧挨的,我们只能进入其中一个。
所以细分问题为:进入0号房或者不进入0号房。
- 进入0号房
如果偷了0号房,那么我们首先就不能再进入1号,和n-1号。
剩下的2n-2号就是一个打家劫舍I的子问题:从2n-2号进行打家劫舍I。
- 不进入0号房
如果不进入了0号房,那么我们可以划分1n-1号房为打家劫舍I的子问题,从1n-1号房进行打家劫舍I。
状态转移方程
和打家劫舍I一样。
- f[i]
进入i号房间就不能进入i-1号房间。(与打家劫舍I、按摩师分析相同)
f[i] = g[i-1] + nums[i]
- g[i]
不进入i号房,就要选择进入或者不进入i-1号房。(与打家劫舍I、按摩师分析相同)
g[i] = max(f[i-1], g[i-1])
初始化和填表顺序
- 初始化
(与打家劫舍I、按摩师分析相同)
f[0] = nums[0], g[0] = 0;
- 填表顺序
(与打家劫舍I、按摩师分析相同)
从左向右填表即可。
返回值
(与打家劫舍I、按摩师分析相同)
返回较大的那个金额即可。
提醒
仅仅是对问题进行分类,实际上还是打家劫舍I(按摩师)问题。
看到这里就可以去尝试实现代码了,然后再看下面的内容。
代码实现
class Solution {
public:int rob1(vector<int>& nums, int left, int right){if(left > right) return 0;//创建dp数组int n = nums.size();vector<int> f(n);vector<int> g(n);//初始化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]);}int rob(vector<int>& nums) {int n = nums.size();return max(nums[0] + rob1(nums, 2, n-2), rob1(nums, 1, n-1));}
};

总结
细节1:本质上是进行打家劫舍I(按摩师)问题,只需要划分好区间即可。
细节2:注意,如果left>right时,还进行填表就没有意义了
细节3:初始化时,我们从传进来的位置left初始化即可,填表从传进来的left+1开始。
细节4:返回值是最后一个位置的元素即为max(f[right], g[right])
细节5:大家都不要学习偷窃这种行为。
相关文章:
[动态规划] (十二) 简单多状态 LeetCode 213.打家劫舍II
[动态规划] (十二) 简单多状态: LeetCode 213.打家劫舍II 文章目录 [动态规划] (十二) 简单多状态: LeetCode 213.打家劫舍II题目解析解题思路状态表示状态转移方程初始化和填表顺序返回值提醒 代码实现总结 213. 打家劫舍 II 题目解析 本题是对打家劫舍和按摩师的升级题型&am…...
算法与数据结构之链表
链表的定义,相信大家都知道,这里就不赘述了只是链表分单向链表和双向链表,废话不多说,直接上代码 链表节点的定义: public class Node {int val;Node next;Node pre;public Node(int val, Node next, Node pre) {thi…...
深入剖析React Hooks中的 useCallback
前言 自 React 16.8 版本引入 Hooks 以来,useCallback 成为了前端开发者们越来越青睐的一个功能。useCallback 可以有效优化组件性能,尤其在处理函数式组件中的状态更新时。本文将详细介绍 useCallback 的用法及其注意事项。 1. useCallback 简介 use…...
微服务中配置文件(YAML文件)和项目依赖(POM文件)的区别与联系
实际上涉及到了微服务架构中的两个重要概念:服务间通信和项目依赖管理。在微服务架构中,一个项目可以通过两种方式与另一个项目建立依赖关系:通过配置文件(如YAML文件)和通过项目依赖(如POM文件)…...
Java快速排序算法、三路快排(Java算法和数据结构总结笔记)[7/20]
一、什么是快速排序算法 快速排序的基本思想是选择一个基准元素(通常选择最后一个元素)将数组分割为两部分,一部分小于基准元素,一部分大于基准元素。 然后递归地对两部分进行排序,直到整个数组有序。这个过程通过 par…...
【React】05.JSX语法使用上的细节
水水水水水...
LeetCode 1759. 统计同质子字符串的数目【字符串】1490
本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…...
FPGA UDP RGMII 千兆以太网(2)IDDR
1 xilinx原语 在 7 系列 FPGA 中实现 RGMII 接口需要借助 5 种原语,分别是:IDDR、ODDR、IDELAYE2、ODELAYE2(A7 中没有)、IDELAYCTRL。其中,IDDR和ODDR分别是输入和输出的双边沿寄存器,位于IOB中。IDELAYE2和ODELAYE2,分别用于控制 IO 口输入和输出延时。同时,IDELAYE2 …...
chrome安装vue devtools
不能访问应用商店 如果可以访问应用商店可以往下看 插件源代码 选择shell-chrome,这是官方的插件源码 下载源代码打包 参考教程 点击扩展按钮->管理扩展程序->打开开发者模式->把crx文件拖拽进去即可 可以访问chrome应用商店 插件地址 官方文档地址 选…...
【Docker】iptables命令的使用
iptables是一个非常强大的Linux防火墙工具,你可以使用它来控制网络流量的访问和转发。 前面已经学习了iptables的基本原理,四表五链的基本概念,也已经安装好了iptables,下面我们主要学习iptables命令的基本使用。 可以使用iptable…...
Flex bison 学习好代码
计算机的重要课程编译原理很难学吧, 但是要会用flex &bison的话,容易理解一些。 有些好的项目可以帮助我们,比如 https://github.com/jgarzik/sqlfun 可以帮我们,下载 下来。 在cygwin 下面或者linux 运行: …...
学习Nginx配置
1.下载地址 官网地址:NGINX - 免费试用、软件下载、产品定价 (nginx-cn.net) 我这边选择NGINX 开源版 nginx: download 2.nginx的基本配置 配置文件语法 配置文件组成:注释行,指令块配置项和一系列指令配置项组成。 单个指令组成&#x…...
怎么批量获取文件名,并保存到excel?
怎么批量获取文件名?什么叫批量获取文件名,其实也非常好理解,就是面对大量文件是可以一次性的获取所有文件名称,这项技术的应用也是非常常见的,为什么这么说呢?现在很多的文档管理人员或者公司的文员&#…...
数据结构: unordered_map与unordered_set
目录 1.框架 2.结构 unordered_map unordered_set 3.对HashTable的修改 更改模板参数 4.增加迭代器 a.结构 b.运算符重载 c.HashTable封装迭代器 d.unordered_map与unordered_set的迭代器 1.框架 1.复用HashTable ~~> 增加模板参数KeyOfT 来获取 Key值 unorder…...
WebDAV之π-Disk派盘 + PassStore
大家常用的qq,手机微信,新浪微博等。假如各个网址都设成同样的帐号和登陆密码,一旦某一帐户泄漏了,别的平台上的账户密码都有被撞库攻击的风险。在不一样的站点设定不一样的高韧性登陆密码才算是最安全可靠的确保,殊不知这般繁多的帐户密码是难以记得的。因而,有着一款安…...
OpenCV实现手势虚拟拖拽
前言: Hello大家好,我是Dream。 今天来学习一下如何使用OpenCV实现手势虚拟拖拽,欢迎大家一起前来探讨学习~ 一、主要步骤及库的功能介绍 1.主要步骤 要实现本次实验,主要步骤如下: 导入OpenCV库。通过OpenCV读取摄…...
深圳市宝安区委常委、宣传部部长周学良一行莅临联诚发考察调研
11月9日,深圳市宝安区组织开展主题教育“大走访、大座谈、大起底”行动和调查研究、“基层调研服务日”活动。当日上午,区委常委、宣传部部长周学良率调研组莅临联诚发LCF总部考察调研。区委宣传部副部长孙箫韵,区文化广电旅游体育局党组成员…...
Presentation Prompter 5.4.2(mac屏幕提词器)
Presentation Prompter是一款演讲辅助屏幕提词器软件,旨在帮助演讲者在公共演讲、主持活动或录制视频时更加流畅地进行演讲。以下是Presentation Prompter的一些特色功能: 提供滚动或分页显示:可以将演讲稿以滚动或分页的形式显示在屏幕上&a…...
9 网关的作用
1、总结: 1.如果离开本局域网,就需要经过网关,网关是路由器的一个网口。 2.路由器是一个三层设备,里面有如何寻找下一跳的规则 3.经过路由器之后 MAC 头要变,如果 IP 不变,相当于不换护照的欧洲旅游&#…...
计算机网络实验
计算机网络实验 使用软件PT7.0按照上面的拓扑结构建立网络,进行合理配置,使得所有计算机之间能够互相通信。并且修改各交换机的系统名称为:学号_编号,如你的学号为123,交换机Switch0的编号为0,则系统名称为…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...
