【动态规划】LeetCode-198/LCR089.打家劫舍

🎈算法那些事专栏说明:这是一个记录刷题日常的专栏,每个文章标题前都会写明这道题使用的算法。专栏每日计划至少更新1道题目,在这立下Flag🚩
🏠个人主页:Jammingpro
📕专栏链接:算法那些事
🎯每日学习一点点,技术累计看得见

题目

题目描述

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

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

执行示例

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

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

提示

1 <= nums.length <= 100
0 <= nums[i] <= 400

题解

有题目可知,由于偷盗连续的房屋将触发报警,小偷若偷窃第i家,则其不能偷窃第i-1家及i+1家,但其可以偷窃i-2家及i+2家。这种偷窃方式是“一家偷一家不偷”的方式,如下图所示↓↓↓
在这里插入图片描述
除了上面的偷窃方式,小偷可以偷完第i家后,间隔两家再偷,即“偷一家不偷不偷”的方式,如下图所示↓↓↓
在这里插入图片描述
那么可不可以偷完1家,接下来的3家都不偷呢?偷一家不偷三家这种方式虽然不会出发报警,但是题目要求我们偷窃金额最大。如下图所示,小偷若偷了0号和4号房子,他还可以偷2号房子,如果不偷的话,则偷窃金额可能减小,因此必须偷。偷完1家,休息n(n≥4)家与这个同理。
在这里插入图片描述
我们另nums数组存储房子的金额,设dp表(一维数组)来存储到达第i号房子时的最大金额。则我们可以得到状态转移方程(递推公式)->dp[i]=nums[i]+max(dp[i-2],dp[i-3])。为什么是max(dp[i-2],dp[i-3])呢?因为我们偷了第i号房子,则只能偷i-2号房子及之前的房子。这里为什么只需要考虑i-2和i-3已经在前面分析过了。至此我们就可以开始编写代码了↓↓↓

class Solution {
public:int rob(vector<int>& nums) {int n = nums.size();vector<int>dp(n);dp[0] = nums[0];if(n == 1) return nums[0];dp[1] = max(nums[0], nums[1]);if(n == 2) return dp[1];dp[2] = max(nums[0] + nums[2], nums[1]);if(n == 3) return dp[2];for(int i = 3; i < n; i++)dp[i] = nums[i] + max(dp[i - 2], dp[i - 3]);return max(dp[n - 1], dp[n - 2]);}
};

这个代码在考虑n≤3时使用了许多条件语句,我们可以换个思考角度来减少这些处理操作。我们对一个房子的决策只有两种,一种是偷,一种是不偷。则此时我们可以得到另一种状态转移方程(递推公式)->dp[i]=max(dp[i-1], dp[i-2]+nums[i]),其中dp[i-1]表示不偷第i家,dp[i-2]+nums[i]表示偷第i家。因此,我们可以得到新的代码↓↓↓

class Solution {
public:int rob(vector<int>& nums) {int n = nums.size();if(n == 1) return nums[0];vector<int>dp(n);dp[0] = nums[0];dp[1] = max(nums[0], nums[1]);for(int i = 2; i < n; i++)dp[i] = max(dp[i - 1], dp[i - 2] + nums[i]);return dp[n - 1];}
};

本文存在不足,欢迎留言或私信批评、指正。希望我的解决方法能够对你有所帮助~~
今日打卡完成,点亮小星星☆→★

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

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

相关文章

MS85163实时时钟/日历可Pin to Pin兼容PCF8563

MS85163/MS85163M是一款CMOS实时时钟(RTC) 和日历电路&#xff0c;针对低功耗进行了优化&#xff0c;内置了可编程的时钟输出、中断输出和低电压检测器。可Pin to Pin兼容PCF8563。所有寄存器地址和数据都通过两线双向I 2C总线进行串行传输&#xff0c;最大总线传输速度为 400k…

2023年【上海市安全员C3证】新版试题及上海市安全员C3证试题及解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 上海市安全员C3证新版试题是安全生产模拟考试一点通总题库中生成的一套上海市安全员C3证试题及解析&#xff0c;安全生产模拟考试一点通上上海市安全员C3证作业手机同步练习。2023年【上海市安全员C3证】新版试题及上…

干货分享:盘点8款优秀的自动化测试工具

如今&#xff0c;作为一名软件测试工程师&#xff0c;几乎所有人都需要具备自动化测试相关的知识&#xff0c;并且懂得如何去利用工具&#xff0c;来为企业减少时间成本和错误成本。这是为什么呢&#xff1f; 在以前&#xff0c;测试人员一般都只需要扮演终端用户&#xff0c;…

CV计算机视觉每日开源代码Paper with code速览-2023.11.29

点击CV计算机视觉&#xff0c;关注更多CV干货 论文已打包&#xff0c;点击进入—>下载界面 点击加入—>CV计算机视觉交流群

用Python创建日历详细指南与实用示例

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;我是彭涛&#xff0c;今天为大家分享 用Python创建日历详细指南与实用示例&#xff0c;全文4800字&#xff0c;阅读大约15分钟。 在日常生活和工作中&#xff0c;创建和管理日历是一项关键任务。Python提供了丰富…

【ArcGIS Pro微课1000例】0047:深度学习--棕榈树提取全流程

一、创建训练样本 对汤加科洛瓦伊种植园每棵棕榈树的健康状况进行清查和评估,这需要花费大量的时间和劳动力。 为简化此过程,将在 ArcGIS Pro 中使用深度学习模型来识别树木,然后根据植被绿度的测量值计算其健康状况。 第一步是找到显示汤加科洛瓦伊的影像,该影像具有足够…

无需服务器,无需魔法,拥有一个微信机器人就是这么简单

前情提要 还没看过的朋友可以看一下上一篇文章《拥有一个微信机器人总共需要几步&#xff1f;》在这篇文章里&#xff0c;我们提到&#xff0c;创建微信机器人需要一个大前提--你得有一台服务器。现在&#xff0c;不再需要了&#xff01;没错&#xff0c;上一篇提到的Serverles…

创建测试库和测试表

-- 创建测试库 create database integration_fusion default character set utf8mb4 collate utf8mb4_general_ci; USE integration_fusion; SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0; -- 创建测试表 DROP TABLE IF EXISTS demo; CREATE TABLE demo ( id bigint NO…

巧借C++算法实现冒泡排序算法

目录 引言冒泡排序原理具体实现步骤示例代码时间复杂度和稳定性优化可能性结束语 引言 作为计算机专业出身的开发者&#xff0c;以及从事软件开发相关的小伙伴&#xff0c;想必对C语言并不陌生&#xff0c;它是一门非常厉害的编程语言&#xff0c;不仅是基于程序底层的语言&a…

JavaSE基础50题:9. 求1~100内的所有素数

【概述】 素数&#xff1a;只能被1和自己整除。 素数的判断方法&#xff1a; 我们把非素数都写成 ab 的形式&#xff0c;如&#xff1a; 16 116 16 28 24 124 24 212 24 38 24 46 同样&#xff0c;我们发现&#xff0c;a 和 b 其中一定会有一个数字 < 根号n&#xff0…

SIT2596,可替代LM2596,40V 输入 150KHz 3A 降压型电源转换器

SIT2596 是一款降压型开关电压调节芯片&#xff0c;可固定输出 3.3V、5V、12V&#xff0c;也可根据需要调节 输出电压&#xff0c;电压输出范围在 1.2V-37V&#xff0c;输入电压最高可达 40V,输出电流可达 3A;同时具有优异 的线性调整率和负载调整率。 SIT2596 内部集成频率…

三次握手四次挥手

第一次握手 A 创建本地的传输控制模块 TCB&#xff0c;然后创建一个 TCP 报文段&#xff0c;报文段中&#xff1a; SYN 1 同步控制位&#xff08;1 时候不能携带数据&#xff09; seq x&#xff1b;序号&#xff0c;供 B 确认 由于此时 SYN 为 1&#xff0c;不能给携带数据&…

Educational Codeforces Round 159(div2) --- E. Collapsing Strings-- 题解

目录 E. Collapsing Strings 题目大意&#xff1a; 思路&#xff1a; 代码: E. Collapsing Strings Problem - E - Codeforces 题目大意&#xff1a; 给你n个字符串&#xff0c;然后对任意两个字符串进行合并操作&#xff0c; 设两个字符串 a 和 b 的折叠 C(a,b) 是以下…

中危漏洞!小程序优惠卷遍历

进入小程序&#xff0c;因为是一个小商城&#xff0c;所以照例先查看收货地址是否存在越权&#xff0c;以及能否未授权访问&#xff0c;但是发现不存在这些问题&#xff0c;所以去查看优惠卷 进入领券中心&#xff0c;点击领取优惠券时抓包 发现数据包&#xff0c;存在敏感参数…

DevEco Studio将常用内容设为代码模板 通过快捷键调出

有时候 我们开发 可能有一些经常要写的内容 天天CV大法找东西也非常麻烦 我们这里打开编辑器 选择 File下的Settings 打开设置界面 选择 Editor 下的 Live Templates 模板 然后 我们点击右侧加号 然后点第一个 加一个 这里 我们设置 输入 em时会触发提示 内容时 问君能有几…

使用Serv-U FTP服务器共享文件,实现无公网IP环境下远程访问

文章目录 1. 前言2. 本地FTP搭建2.1 Serv-U下载和安装2.2 Serv-U共享网页测试2.3 Cpolar下载和安装 3. 本地FTP发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 科技日益发展的今天&#xff0c;移动电子设备似乎成了我们生活的主角&#xff0c;智能…

每日一题(LeetCode)----字符串--反转字符串

每日一题(LeetCode)----字符串–反转字符串 1.题目&#xff08;344. 反转字符串&#xff09; 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) …

网盘系统设计:万亿 GB 网盘如何实现秒传与限速?

Java全能学习面试指南&#xff1a;https://javaxiaobear.cn 网盘&#xff0c;又称云盘&#xff0c;是提供文件托管和文件上传、下载服务的网站&#xff08;File hostingservice&#xff09;。人们通过网盘保管自己拍摄的照片、视频&#xff0c;通过网盘和他人共享文件&#xff…

C++进阶篇6---lambda表达式

目录 一、lambda表达式 1.引入 2、lambda表达式语法 二、包装器---function 1.引入 2.包装器介绍 三、bind 一、lambda表达式 1.引入 class Person { public:Person(int age,string name):_age(age),_name(name){} //private://方便后面的举例int _age;string _name…

CAN总线负载率

总线负载率就是每秒钟传输了多少个位&#xff0c;波特率为500K的总线上每秒钟能够传输500‘000位&#xff0c;如果在某一秒中总线上只传输了100000位&#xff0c;则总线负载率为20%。 总线负载率 总线每秒上传输的实际位数 / 总线波特率 * 100% CAN总线负载率是CAN总线架构协…