动态规划算法:13.简单多状态 dp 问题_打家劫舍II_C++

 目录

题目链接:LCR 090. 打家劫舍 II - 力扣(LeetCode)

一、题目解析

题目:

解析:

二、算法原理

1、状态表示

2、状态转移方程

  状态转移方程推理:

1、i位置状态分析

 2、首尾状态分析

3、初始化

dp表初始化:

特殊位置初始化:

4、填表顺序

5、返回值

三、编写代码

细节问题解释:


题目链接:LCR 090. 打家劫舍 II - 力扣(LeetCode)

一、题目解析

题目:

解析:

  由题目可知,小偷不可以偷相邻的两个房间,并且题目告诉我们第一个房间是和第二个房间相连的,所以小偷偷完第一个房间,就不可以偷最后一个房间。  

  这与上一道打家劫舍问题相比,这个题目需要我们多考虑首尾相连问题

  我们拿示例1举例:

只有三个房间,小偷如果先偷第一个房间,那么就不可以偷第二个第三个房间,所以只能偷第二个房间才能使获取金钱数到达最大

二、算法原理

1、状态表示

我们在状态表示的时候,一般都会创建一个数组dp,也就是我们所说的dp表,我们要做的就是把每一个状态的值填入这个表内,最终这个表内的某一个值可能就是我们要返回的值。 

  状态简单理解就是dp表内某一个值代表的含义。

如何确定状态表示

  • 题目要求

   简单的题目里一般会给出

  • 经验+题目要求

  越学越深入,动态规划也是熟能生巧,在题目中没有明显给出的时候,我们就要凭借自己做题的经验来确定,所以就需要我们大量的做题。

  • 分析问题的过程中,发现重复子问题

 分析问题的过程中把重复子问题抽象成我们的状态表示,这个更难理解,一切的基础都是我们先对动态规划算法熟练运用。我也不懂,我们慢慢来。

综上:我们通常会以一个位置为结尾或者开始求得我们想要的答案

那我们的这道题得状态表示是什么样的:

根据经验,我们仍以一个位置为结尾做题

状态表示:dp[i]表示到达i位置时获取的金钱数达到最大

2、状态转移方程

 确定状态表示之后我们就可以根据状态标识推出状态转移方程

  状态转移方程是什么?

不讲什么复杂的,简单来说状态转移方程就是    dp[i]等于什么 dp[i]=?

  这个就是状态转移方程,我们要做的,就是推出dp[i]等于什么

  我们根据状态表示再结合题目+经验去推理转移方程,这一步也是我们整个解题过程中最难的一步

  我们在这道题先简单了解下什么是状态转移方程,之后比较难的题目再细推

  状态转移方程推理:

1、i位置状态分析

我们知道,当小偷到达i位置时有两种状态,一种是偷,一种是不偷

我们令在i位置偷时金钱数达到最大值得情况为f[i],不偷时的情况为g[i],原房间金钱数数组为nums

 2、首尾状态分析

当小偷从第一个位置开始偷时,就不可以偷最后一个房间,范围为1到n-1(n为房间数)

当小偷从第二个位置偷时,就可以偷最后一个房间,范围为2到n

 


 我们分析的首尾两种状态是本道题的两种大状态,因为小偷只能这样做抉择,不然就会报警,所以说,我们最终的答案要要从这两种状态里选择一个最大值

  我们把首尾相连的问题化成了两种状态,所以我们在这两种状态里就不用在考虑首尾相连的问题,我们就可以把这两种状态变成我们之前做过的打家劫舍I,上一篇写过

  打家劫舍I文章链接:动态规划算法:12.简单多状态 dp 问题_打家劫舍_C++-CSDN博客

3、初始化

 我们创建dp表就是为了把他填满,我们初始化是为了防止在填表的过程中越界

怎么谈越界?

我们在填f[0]时,我们会发现,到达该位置前的f[-1]位置根本不存在

dp表初始化:

这里不用对dp表做特殊初始化

特殊位置初始化:

仍是打家劫舍I的初始化问题

  • f[0]=nums[0]
  • g[0]=0

4、填表顺序

从左到右依次填表,两个表同时填写

5、返回值

这里的返回值,是我们两种状态所求的值作比较后返回的一个较大的值

三、编写代码

class Solution {
public:
    int rob(vector<int>& nums) {
        int n=nums.size();
//两种状态最比较,返回最大值
        return max(nums[0]+rob1(nums,2,n-2),rob1(nums,1,n-1));
    }   
//另写一个打家劫舍I的函数,三个参数分别是,原数组,左下标,右下标
    int rob1(vector<int>&nums,int left,int right)
{
//比较两个下标大小,左下标如果大于有下标择返回0,针对于数组大小很小的特殊情况
    if(left>right)return 0;
    int n=nums.size();
//1、创建dp表
    vector<int> f(n);
    auto g=f;
//2、初始化
    f[left]=nums[left];
//3、填表
    for(int i=left+1;i<=right;i++)
    {
        f[i]=g[i-1]+nums[i];
        g[i]=max(f[i-1],g[i-1]);
    }
//4、返回该状态的最大值
    return max(f[right],g[right]);
}
};

细节问题解释:

1、

第一个位置偷:偷1不偷2,并且不偷最后一个房间,所以左下标为2,右下标为n-2

第一个位置不偷:可偷2和最后一个房间,所以左下标为1,右下标为n-1

进入函数内部,化为打家劫舍I问题求该状态

2、

在打家劫舍I问题里面,我们需要对f[0]初始化为nums[0],但是我们这道题化成打家劫舍I问题则是从左下标left开始,所以初始化f[left]

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《Linux从小白到高手》理论篇(九):Linux的资源监控管理

本篇介绍Linux的资源监控管理。 1、CPU 资源管理 进程调度&#xff1a; Linux 采用公平的进程调度算法&#xff0c;确保每个进程都能获得合理的 CPU 时间。调度算法会根据进程的优先级、等待时间等因素来决定哪个进程获得 CPU 使用权。 可以通过调整进程的优先级来影响其获得…

【数学分析笔记】第4章第2节 导数的意义和性质(1)

4. 微分 4.2 导数的意义与性质 4.2.1 导数在物理中的背景 物体在OS方向上运动&#xff0c;位移函数为 s s ( t ) ss(t) ss(t)&#xff0c;求时刻 t t t的瞬时速度&#xff0c;找一个区间 [ t , t △ t ] [t,t\bigtriangleup t] [t,t△t]&#xff0c;从时刻 t t t变到时刻 t…

架构设计笔记-5-软件工程基础知识-2

知识要点 构件组装是将库中的构件经适当修改后相互连接,或者将它们与当前开发项目中的软件元素连接,最终构成新的目标软件。 构件组装技术大体可分为: 1. 基于功能的组装技术:基于功能的组装技术采用子程序调用和参数传递的方式将构件组装起来。它要求库中的构件以子程序…

产品经理的学习

初学 接需求 画原型 写文档 日常产出 流程图 举例购物的流程 结构图 一个应用的全部功能&#xff0c;用思维导图的方式去罗列出来 竞品分析文档 竞品分类 竞品选择 竞品采集 竞品文档书写 也可以做一个产品的产品结构图 需求文档 干系人 需求方 记录人 产品经理 其他项目干系人…

时序必读论文15|TimeXer:通过外部变量增强Transformer在时间序列预测中的能力

论文标题&#xff1a;TimeXer: Empowering Transformers for Time Series Forecasting with Exogenous Variables 论文链接&#xff1a;https://arxiv.org/abs/2402.19072 前言 仅仅关注内生变量&#xff0c;通常不足以保证准确的预测&#xff0c;外部序列可以为内生变量提供…

蓝桥杯【物联网】零基础到国奖之路:十六. 扩展模块之矩阵按键

蓝桥杯【物联网】零基础到国奖之路:十六. 扩展模块之矩阵按键 第一节 硬件解读第二节 CubeMX配置第三节 MDK代码 第一节 硬件解读 扩展模块和ADC模块是一摸一样的&#xff0c;插在主板上。 引脚对应关系&#xff1a; PB6-ROW1 PB7-ROW2 PB1-COLUMN1 PB0-COLUMN2 PA8-COLUMN3 …

外贸财务软件精选,提升管理效率与精准度

ZohoBooks、QuickBooks等六款会计软件各具特色&#xff0c;支持多币种、国际化等功能&#xff0c;适合不同规模外贸企业。其中&#xff0c;ZohoBooks功能全面&#xff0c;QuickBooks操作简便&#xff0c;SageIntacct适合复杂业务&#xff0c;用友U8和金蝶K/3面向中大型企业&…

【开源免费】基于SpringBoot+Vue.JS微服务在线教育系统(JAVA毕业设计)

本文项目编号 T 060 &#xff0c;文末自助获取源码 \color{red}{T060&#xff0c;文末自助获取源码} T060&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

微服务Redis解析部署使用全流程

目录 1、什么是Redis 2、Redis的作用 3、Redis常用的五种基本类型&#xff08;重要知识点&#xff09; 4、安装redis 4.1、查询镜像文件【省略】 4.2、拉取镜像文件 4.3、启动redis并设置密码 4.3.1、修改redis密码【可以不修改】 4.3.2、删除密码【坚决不推荐】 5、S…

微信小程序 图片的上传

错误示范 /*从相册中选择文件 微信小程序*/chooseImage(){wx.chooseMedia({count: 9,mediaType: [image],sourceType: [album],success(res) {wx.request({url:"发送的端口占位符",data:res.tempFiles[0].tempFilePath,method:POST,success(res){//请求成功后应该返…

机器学习-朴素贝叶斯

分类是机器学习最常见的任务。 定义&#xff1a;给定一个对象 X&#xff0c;将其划分到预定义好的某一个类别 yi中 –输入 X –输出Y &#xff08;取值于有限集 {y1,y 2,…yn }&#xff09; 应用: –人群&#xff0c;新闻分类&#xff0c;Query分类&#xff0c;商品分类&a…

一次实践:给自己的手机摄像头进行相机标定

文章目录 1. 问题引入2. 准备工作2.1 标定场2.2 相机拍摄 3. 基本原理3.1 成像原理3.2 畸变校正 4. 标定解算4.1 代码实现4.2 详细解析4.2.1 解算实现4.2.2 提取点位 4.3 解算结果 5. 问题补充 1. 问题引入 不得不说&#xff0c;现在的计算机视觉技术已经发展到足够成熟的阶段…

用于视觉的MetaFormer基线模型

摘要 https://arxiv.org/pdf/2210.13452 摘要——MetaFormer&#xff0c;即Transformer的抽象架构&#xff0c;已被发现在实现竞争性能中发挥着重要作用。在本文中&#xff0c;我们再次通过将研究重点从令牌混合器&#xff08;token mixer&#xff09;设计转移开&#xff0c;来…

leetcode每日一题day19(24.9.29)——买票需要的时间

思路&#xff1a;对于位置k在队伍最末尾时&#xff0c;位置k前的人对于某一个人需要等的时间为 ​​​​​​​min(tickets[k],tickets[i]) 对于当前的人前方的的人可以使用上述策略&#xff0c;但对于后方由于当前的人有更高的优先&#xff0c;而导致情况有所不…

51单片机应用开发---keil 创建一个新工程并用Protues 8仿真(以点亮LED为例)

实现目标 1、掌握keil V5软件 创建一个新工程&#xff1b; 2、具体目标&#xff1a;1.会新建一个工程&#xff1b;2.编程实现点亮开发板的LED1. 一、新建工程步骤 1.1 在桌面上新建一个名字为 LED的文件夹 1.2 双击打开Keil uVision5 软件&#xff0c;点击 Project —>…

目标检测技术的发展:从R-CNN、YOLO到DETR、DINO

“深度人工智能”是成都深度智谷科技旗下的人工智能教育机构订阅号&#xff0c;主要分享人工智能的基础知识、技术发展、学习经验等。此外&#xff0c;订阅号还为大家提供了人工智能的培训学习服务和人工智能证书的报考服务&#xff0c;欢迎大家前来咨询&#xff0c;实现自己的…

修改Kali Linux的镜像网站

由于官方的镜像可能会出现连接不上的问题导致无法安装我们所需要的包&#xff0c;所以需要切换镜像站为国内的&#xff0c;以下是一些国内常用的Kali Linux镜像网站&#xff0c;它们提供了与Kali Linux官方网站相同的软件包和资源&#xff0c;但访问速度更快&#xff1a; #官方…

【CKA】二、节点管理-设置节点不可用

2、节点管理-设置节点不可用 1. 考题内容&#xff1a; 2. 答题思路&#xff1a; 先设置节点不可用&#xff0c;然后驱逐节点上的pod 这道题就两条命令&#xff0c;直接背熟就行。 也可以查看帮助 kubectl cordon -h kubectl drain -h 参数详情&#xff1a; –delete-empty…

User-Agent在WebMagic爬虫中的重要性

对于需要从网站上抓取数据的开发者来说&#xff0c;WebMagic是一个强大的工具。它是一个简单灵活的Java爬虫框架&#xff0c;用于抓取网页数据。在爬虫技术中&#xff0c;User-Agent&#xff08;用户代理&#xff09;是一个关键的HTTP请求头&#xff0c;它告诉服务器关于客户端…

LeetCode 面试经典150题 50.Pow(x,n)

题目&#xff1a;实现 pow(x, n) &#xff0c;即计算 x 的整数 n 次幂函数&#xff08;即&#xff0c; &#xff09;。 思路&#xff1a; 代码&#xff1a; class Solution {public double myPow(double x, int n) {double ans 1;long N n;if (N < 0) {N -N;x 1 / x;}…