[动态规划] (十二) 简单多状态 LeetCode 213.打家劫舍II

news2024/9/30 3:25:12

[动态规划] (十二) 简单多状态: LeetCode 213.打家劫舍II

文章目录

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

213. 打家劫舍 II

image-20231107165029262

题目解析

本题是对打家劫舍和按摩师的升级题型,可以看完上一道题再来看下面的内容。

[动态规划] (十一) 简单多状态 LeetCode 面试题17.16.按摩师 和 198.打家劫舍-CSDN博客

(1) 房屋是环绕的,第一个房子和最后一个房子是紧挨着的

(2) 不能连续进入房子

(3) 返回最高金额

解题思路
状态表示

dp[i]:按照以往的经验,以i为结尾可以获得的最高的金额。

dp[i]又可以分为偷到i位置时,进入i房间(f[i])不进入i房间(g[i])。(详情可以点之前的链接。)

但是本题又不一样,多了个房屋环绕,如图。

image-20231107165806156

由于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));
    }
};

image-20231107170910244

总结

细节1:本质上是进行打家劫舍I(按摩师)问题,只需要划分好区间即可。

细节2:注意,如果left>right时,还进行填表就没有意义了

细节3:初始化时,我们从传进来的位置left初始化即可,填表从传进来的left+1开始。

细节4:返回值是最后一个位置的元素即为max(f[right], g[right])

细节5:大家都不要学习偷窃这种行为。

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

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

相关文章

ae如何保存为gif格式?三个方法轻松搞定!

GIF是动态图像&#xff0c;在聊天的时候发的动态表情包就是GIF&#xff0c;非常受大家欢迎。那么如何把视频变成GIF格式呢&#xff0c;下面是一些具体的操作步骤。 一、AE 1、依次点击AE菜单栏文件 — 导出 — 添加到渲染队列 — 导出MOV视频格式 2、依次点击导入MOV — 储存W…

jenkins原理篇——成员权限管理

大家好&#xff0c;我是蓝胖子&#xff0c;前面几节我讲述了jenkins的语法以及我是如何使用jenkins对测试和正式环境进行发布的。但正式环境使用jenkins还有一点很重要&#xff0c;那就是权限管理。正式环境的权限往往不能对所有人开放&#xff0c;以及要做到每次发布都是谁在操…

PMI-ACP(103:57- 103)

57/103 高绩效敏捷团队的特征 参与式指导有效的决策开放和清晰的沟通价值多样性相互信任管理冲突清楚目标明确定义角色 和 职责协调关系积极的氛围 58/103 创建授权团队 敏捷强调 具备授权和积极性 的自我管理团队&#xff0c;他们需要对项目成果充分负责&#xff0c;授权是…

0基础两小时建网站

​作者主页 &#x1f4da;lovewold少个r博客主页 ⚠️本文重点&#xff1a;0基础2小时搭建个人网站 &#x1f449;【C-C入门系列专栏】&#xff1a;博客文章专栏传送门 &#x1f604;每日一言&#xff1a;宁静是一片强大而治愈的神奇海洋&#xff01; 目录 前言 第一步 环境…

Redis Desktop Manager安装和使用

Redis Desktop Manager&#xff08;RDM&#xff09;是一款用于管理和操作Redis数据库的图形化界面工具。提供了简单易用的界面&#xff0c;使用户能够方便地执行各种Redis数据库操作&#xff0c;并且支持多个Redis服务器的连接RDM功能介绍&#xff1a;1.连接管理&#xff1a;RD…

DC-DC降压芯片120V转12V5A大功率SL3038电源芯片

本文将介绍一款DC-DC降压芯片&#xff0c;将120V的电压转换为12V5A的大功率输出&#xff0c;使用SL3038电源芯片实现。在开始介绍之前&#xff0c;我们先来了解一下DC-DC降压芯片和SL3038电源芯片的基本原理和特点。 DC-DC降压芯片是一种常见的电源管理芯片&#xff0c;它可以将…

爱上联名的白酒,还是拿不下年轻人?

作者&#xff5c;Kyra 编辑&#xff5c;Ray “才喝完“酱香拿铁”&#xff0c;又吃了“浓香冰淇淋&#xff0c;古茗和天官赐福的联名刚也已经下单了&#xff0c;完美。”热衷于收集各种联名的Bella在办公室欢呼道。 现在品牌之间的联名意欲拿捏年轻人&#xff0c;特别是白酒…

maven中的install 和 clean命令,以及compile、、package、test等操作介绍

maven中的install命令 主要就是谁要被其他模块依赖就install谁 Maven工具可以进行clean、compile、install、package、test等操作&#xff0c;但是这些操作有什么用呢&#xff0c;以下面的p2p-exterface为例说明一下&#xff0c;pwp-exterface工程目录如下&#xff1a; com…

从JDK8升级到JDK17

JDK8太老了&#xff0c;发布10年了吧&#xff0c;新开发的还是用最新免费长期支持版JDK17吧。这次把工程和环境升级到JDK17再继续后面工作&#xff0c;避免后面写多了还得解决升级问题。 先从官网下载JDK17 下载地址 解压后的文件夹放到一个位置 然后修改环境变量 修改好之…

IntelliJ IDEA 如何修改默认Maven仓库地址

在使用idea过程中&#xff0c;每次新建项目或者打开项目时&#xff0c;maven仓库地址都会变为默认地址。如何修改默认地址&#xff0c;让其保持不变&#xff0c;如下这种方式可以简单快捷的设置。 1.打开idea&#xff0c;取消项目自动加载 2.点击 Customize,然后再点击 All se…

spdk用户态块层详解

先通过回顾内核态的通用块层来详细介绍SPDK通用块层&#xff0c;包括通用块层的架构、核心数据结构、数据流方面的考量等。最后描述基于通用块层之上的两个特性&#xff1a;一是逻辑卷的支持&#xff0c;基于通用块设备的Blobstore和各种逻辑卷的特性&#xff0c;精简配置&…

【数据结构】树与二叉树(四):满二叉树、完全二叉树及其性质

文章目录 5.1 树的基本概念5.1.1 树的定义5.1.2 森林的定义5.1.3 树的术语5.1.4 树的表示 5.2 二叉树5.2.1 二叉树1. 定义2. 特点3. 性质引理5.1&#xff1a;二叉树中层数为i的结点至多有 2 i 2^i 2i个&#xff0c;其中 i ≥ 0 i \geq 0 i≥0。引理5.2&#xff1a;高度为k的二叉…

【git】TortoiseGit图标不显示 及 文件夹中.git文件夹不显示

&#xff08;一&#xff09;文件夹中.git文件夹不显示 在 文件夹选项-查看-高级设置 中&#xff0c; 将 隐藏文件和文件夹中的不显示&#xff0c;标记为“显示隐藏的文件、文件夹和驱动器” &#xff08;二&#xff09;TortoiseGit图标不显示 【情况一】是否有正确安装 Tort…

【STM32-DSP库的使用】基于Keil5 + STM32CubeMX 手动添加、库添加方式

STM32-DSP库的使用 一.CMSIS-DSP1.1 DSP库简介1.2 支持的函数类别1.3 宏定义 二、操作2.1 STM32CubeMX 配置基本工程2.2 Lib库的方式实现(推荐)2.3 手动添加DSP文件&#xff08;可以下载官方最新库&#xff0c;功能齐全&#xff09; 三、MFCC测试DSP加速效果 为验证语音识别MFC…

wait()和notify()

线程的状态 状态是针对当前线程调度的情况来描述的,也可以认为线程是调度的基本单位,在Java中对线程的状态进行了细化,主要分为下面几种状态 ★ 1.NEW 创建了Thread对象,但是还没有调用start ★ 2. TERMINATED 表示内核中的pcb已经执行完了,但是Thread对象还在. ★ 3. RUNNA…

初识微服务技术栈

认识微服务 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为现在流行的微服务架构&#xff0c;这些架构之间有怎样的差别呢&#xff1f; 导学&#xff1a; 了解微服务的优缺点&#xff1b;了解微服务架构的演变过程&am…

分布式任务调度(00)--Quartz

1 任务调度整体流程 2 组件 调度器 &#xff1a;工厂类创建Scheduler&#xff0c;根据触发器定义的时间规则调度任务任务&#xff1a;Job表示被调度的任务触发器&#xff1a;Trigger 定义调度时间的元素&#xff0c;按啥时间规则执行任务。一个Job可被多个Trigger关联&#xf…

ps人像怎么做渐隐的效果?

photoshop怎么制作人像渐隐的图片效果&#xff1f;渐隐效果需要使用渐变来实现&#xff0c;下面我们就来看看详细的教程。 首先&#xff0c;我们打开Photoshop&#xff0c;点击屏幕框选的【打开】&#xff0c;打开一张背景图片。 下面&#xff0c;我们点击左上角【文件】——【…

centos7安装jdk-阿里云服务器

1.背景 2.安装步骤 步骤:(特别注意:虚拟机安装的一般是32位的操作系统,jdk也必须使用32位的) 查看虚拟机版本:sudo uname --m i686 //表示是32位 x86_64 // 表示是64位 查看是否已经安装jdk 看看 是否设置了jdk环境变量: echo $JAVA_HOME&#xff1b; 或运行命令&#xff1a; …

文件换行符导致linux里运行python文件找不到文件

现象 运行python代码的时候&#xff1a; 报错信息&#xff1a; : No such file or directoryon3 解决方法 在pycharm中把文件的分隔符给改了 这样&#xff0c;把文件的分隔符改成Unix and macOS就可以了