dp--198.打家劫舍/medium 理解度B

198.打家劫舍

  • 1、题目
  • 2、题目分析
  • 3、解题步骤
  • 4、复杂度最优解代码示例
  • 5、抽象与扩展

1、题目

一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响小偷偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警

给定一个代表每个房屋存放金额的非负整数数组 nums ,请计算 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

 

示例 1:

输入:nums = [1,2,3,1]
输出:4
解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。

示例 2:

输入:nums = [2,7,9,3,1]
输出:12
解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。偷窃到的最高金额 = 2 + 9 + 1 = 12 。

 

提示:

  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 400
Related Topics
  • 数组
  • 动态规划

2、题目分析

1、定义出状态:可使用问题即答案的方式,借助问题定义状态,比如问题是“一夜之内能够偷窃到的最高金额。”,即状态可以初步定义为每个房屋,及抵达该房屋时所能偷窃的最大值。那么最终状态,就是答案。
2、推导出状态转移方程:主要是基于动态规划的三个特性来分析题目
注意:动态规划的三个特性,都是要站在状态的角度,而不是站在入参数组的角度。

  1. 重复子问题:
    要求1、存在子问题 (站在状态的角度考虑该特性)
    思考:子问题就是到达各个房屋所能偷窃的最大值。
    要求2、对每个子问题有相同的决策方案 (站在入参数组的角度考虑该特性)
    思考:对每个子问题的决策方案都是2个:①决定偷窃当前房屋、②决定不偷窃该房屋。

  2. 最优子结构:(站在状态的角度考虑该特性)
    问题的最优解可以由子问题的最优解推导出来。这意味着后面阶段的状态仅由前面某阶段的状态即可推导出来。
    求本状态最优解:(对每个房屋都有2个选择,偷窃、或不偷窃)
    1.本状态不偷窃,则本状态值=上一状态最优解
    2.本状态要偷窃,则本状态值=上上状态最优解 + 本房屋的价值
    本状态最优解 = Math.max(上一状态最优解, 上上状态最优解 + 本房屋的价值)
    某状态最优解可由上状态最优解、上上状态最优解推导出来。故本问题满足最优子结构的要求

  3. 无后效性:(站在状态的角度考虑该特性)
    要求1、在推导后面阶段的状态的时候,我们只关心前面某阶段的状态值,不关心这个状态是怎么一步一步推导出来的。
    思考:由2.最优子结构的分析已知,某状态最优解只由上状态最优解、上上状态最优解推导出来。
    要求2、某阶段状态一旦确定,就不受之后阶段的决策影响。无后效性是一个非常“宽松”的要求。只要满足前面提到的动态规划问题模型,其实基本上都会满足无后效性。
    思考:到达第i个房子所能偷到的最大金额,跟后续阶段的决策无关,仅有各阶段的决策决定。故本问题满足这2个无后效性的要求

3、解题步骤

1、初始化状态:基于状态转移方程,考虑需要初始化哪些状态
本状态最优解 = Math.max(上一状态最优解, 上上状态最优解 + 本房屋的价值)
如从该方程可知,我们需要初始化 2 个状态,因为某状态就需要前面 2 个阶段的状态推导出来。
2、迭代状态转移方程

4、复杂度最优解代码示例

    public int rob(int[] nums) {int[] dp = new int[nums.length + 1];// 类似于链表的哨兵,无实际含义,方便该dp代码的编写dp[0] = 0;// 初始化到达第1间房屋时所能偷窃到的最大值dp[1] = nums[0];for(int i = 2; i <= nums.length; i++) {// 1.本状态不偷窃,则本状态值=上一状态最优解// 2.本状态要偷窃,则本状态值=上上状态最优解 + 本房屋的价值// 本状态最优解 = Math.max(上一状态最优解, 上上状态最优解 + 本房屋的价值)dp[i] = Math.max(dp[i - 1], nums[i - 1] + dp[i - 2]);}return dp[nums.length];}

5、抽象与扩展

通用动态规划的解法,见标题二

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

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

相关文章

创建Vue3项目

介绍 使用命令创建vue3项目 示例 第一步&#xff1a;执行创建项目命令 npm create vuelatest第二步&#xff1a;填写输入项 第三步&#xff1a;进入study-front-vue3文件夹 cd study-front-vue3第四步&#xff1a;执行npm命令安装依赖 npm install第五步&#xff1a;运行…

YOLO蒸馏原理篇之---MGD、CWD蒸馏

一、MGD蒸馏 论文地址:https://arxiv.org/abs/2205.01529 论文翻译:https://mp.weixin.qq.com/s/FSvo3ns2maTpiTTWsE91kQ 1.1 摘要 知识蒸馏已成功应用于各种任务。当前的蒸馏算法通常通过模仿教师的输出来提高学生的表现。本文表明,教师还可以通过指导学生的特征恢复来提…

60.网游逆向分析与插件开发-游戏增加自动化助手接口-游戏公告功能的逆向分析与测试

内容来源于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;文字资源读取类的C还原-CSDN博客 码云地址&#xff08;master分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;878db7708de09b448010ef54526fe…

爬虫-3-模拟登录,代理ip,json模块

#本文仅供学习使用(O&#xff40;) 如果服务器响应的数据为json数据: 那么我们可以用 res.json() 或 json模块(将json字符串转换为Python里面的字典类型) 接收数据。

安全防御之安全审计技术

安全防御中的安全审计技术是保障信息系统安全的重要手段之一。其主要目标是对信息系统及其活动进行记录、审查和评估&#xff0c;以确保系统符合安全策略、法规要求&#xff0c;并能够及时发现潜在的安全风险和异常行为。通过安全审计&#xff0c;可以对系统中的各种活动进行记…

高德地图Web服务使用方法——电子围栏

1 高德地图Web服务 1.1 添加Key 注册高德地图&#xff0c;进入控制台&#xff0c;创建新应用&#xff0c;添加Key&#xff0c;选择Web服务&#xff0c;不添加域名白名单&#xff0c;勾选同意政策。 刷新界面&#xff0c;记住获取到的Key。 1.2 下载安装Postman https://www…

Linux who命令教程:如何查看当前登录的用户信息(附实例详解和注意事项)

Linux who命令介绍 who命令用于显示系统中当前登录的用户信息。它可以提供用户ID、使用的终端机、从哪里登录的、登录时间等信息。 Linux who命令适用的Linux版本 who命令在大多数Linux发行版中都可以使用&#xff0c;包括但不限于Ubuntu、Debian、Fedora、CentOS等。如果在…

线性代数 --- 矩阵行列式的性质

Determinant det A|A| 矩阵的行列式是一个数&#xff0c;这个数能够反应一些关于矩阵的信息。行列式只对方阵有效。 若矩阵A为&#xff1a; 则A的行列式为&#xff1a; 性质1&#xff1a; 单位矩阵的行列式等于1 性质2&#xff1a;行与行之间的交换会改变det的正负号 以2x2单位…

01flex布局

flex 布局 使用方式 容器 也称弹性盒子&#xff0c;可以根据屏幕大小自动适应&#xff0c;只有一个; 子项目 容器内的直接子元素&#xff0c;可以有多个 主轴 Flex容器的主要方向&#xff0c;由 flex-direction 属性定义。可以是水平方向&#xff08;row 或 row-reverse&#…

Qt OpenGL中渲染和画图的相互理解

在Qt编程(或者别的图形编程中),我们很容易理解画图,一般用draw之类的函数,画圆,画线,画点,画复杂图形,画图片等2D图形。 在某种程度上,渲染和画图可以理解为相似的概念,都是将图形或图像呈现在屏幕上的过程。所以我们也可以说3D渲染其实就是3D画图。但是呢,这样表…

【SQL】加快SQL查询的九种优秀实践

1.只检索需要的列 对于那些所谓的数据库开发老司机而言,他们会有一个常见的SQL习惯:在编写查询代码时,频繁地使用SELECT *,一次性列出所有可能需要的数据列。显然,如果查询一个存储了一百多列的数据表的所有列,您可以想象会发生什么?毕竟在真实的系统应用环境中,这样的…

Vue知识总结-中

VUE-生命周期 生命周期概述 生命周期也常常被称为生命周期回调函数/生命周期函数/生命周期钩子生命周期是Vue在关键时刻帮我们调用的一些特殊名称的函数生命周期函数的名字不能更改,但函数的具体内容是由我们程序员自己编写的生命周期函数中的this指向是vm或组件实例对象 生命周…

【软件测试】学习笔记-如何做好测试计划

本篇文章将为你介绍一份成功的测试计划应该包含哪些内容&#xff0c;以及如何才能做好测试计划。 软件项目&#xff0c;通常都会有详细的项目计划。软件测试作为整个项目中的重要一环&#xff0c;也要执行详细的测试计划。正所谓运筹帷幄之中&#xff0c;决胜千里之外&#xf…

【开题报告】基于微信小程序的母婴商品仓库管理系统的设计与实现

1.选题背景 随着社会经济的发展和家庭生活水平的提高&#xff0c;母婴商品市场逐渐兴起。然而&#xff0c;传统的母婴商品仓库管理方式存在着许多问题&#xff0c;如信息不透明、操作繁琐等。为了提高仓库管理的效率和准确性&#xff0c;基于微信小程序的母婴商品仓库管理系统…

Pointnet++损失函数改进:Focalloss | 助力解决正负样本比例不均衡问题

简介:1.该教程提供大量的首发改进的方式,降低上手难度,多种结构改进,助力寻找创新点!2.本篇文章对Pointnet++特征提取模块进行改进,加入Focalloss损失函数,解决正负样本比例不均衡问题。3.专栏持续更新,紧随最新的研究内容。 目录 1.理论介绍 2.修改步骤 2.1 步骤一…

解决在test以外的目录下导入junit无效

以上引用来自src目录下的文件&#xff0c;可以看到&#xff0c;和junit有关的导入都飘红&#xff0c;但明明junit已经被正确导入进了项目中。 再看右侧的Maven的依赖下方&#xff0c;junit的右边有一个很不起眼的(test) 这是因为junit作为测试框架&#xff0c;可能包含仅适用于…

杰发科技AC7840——CAN通信简介(2)

1.时钟频率 2.位时间 3.采样点 4.消息缓冲区 和ST、NXP的邮箱类似&#xff0c;AutoChips用了缓冲区的概念。 5.接收缓冲区 屏蔽掉demo程序的发送&#xff0c;只看接收情况 在回调中接收数据 先判断是不是进了接收中断 接收数据的处理函数 所有buff数据放到Info buff的内容 BUF…

NumPy 高级教程——性能优化

Python NumPy 高级教程&#xff1a;性能优化 在处理大规模数据集或进行复杂计算时&#xff0c;性能是关键的考虑因素。NumPy 提供了一些工具和技巧&#xff0c;帮助用户优化代码以提高执行效率。在本篇博客中&#xff0c;我们将深入介绍 NumPy 中的性能优化技术&#xff0c;并…

css_auto的用法

<div style"display: flex; justify-content: center;"><div style"margin-right: auto;"></div><div>其他元素</div> </div>auto到底是什么意思&#xff0c;为什么可以让父div中的子div向左边对齐&#xff1f; auto是…

数据结构与算法Python版:基数排序

简介&#xff1a;基数排序&#xff08;radix sort&#xff09;属于“分配式排序”&#xff08;distribution sort&#xff09;&#xff0c;又称“桶子法”&#xff08;bucket sort&#xff09;或bin sort&#xff0c;顾名思义&#xff0c;它是透过键值的部份资讯&#xff0c;将…