【LeetCode】动态规划—打家劫舍(附完整Python/C++代码)

动态规划—#198. 打家劫舍

  • 前言
  • 题目描述
  • 基本思路
    • 1. 问题定义:
    • 2. 理解问题和递推关系:
    • 3. 解决方法:
    • 4. 进一步优化:
    • 5. 小总结:
  • 代码实现
    • Python3代码实现
    • Python 代码解释
    • C++代码实现
    • C++ 代码解释
  • 总结:

前言

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

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

题目描述

在这里插入图片描述

基本思路

1. 问题定义:

你是一个小偷,计划偷窃沿街的房屋,每个房屋里都有一定数量的现金。由于房屋之间装有警报器,如果你偷了相邻的两家,那么警报就会响。因此,你需要设计一个策略,确保不触发警报器的情况下,偷到最多的现金。

给定一个数组 n u m s [ ] nums[] nums[],其中 n u m s [ i ] nums[i] nums[i] 表示第 i i i 个房屋中的现金数,你需要返回你在不触发警报的前提下能偷窃到的最高金额。

2. 理解问题和递推关系:

  • 对于每一个房子,你有两种选择:
  1. 偷这个房子,那么你就不能偷前一个房子,只能考虑前 i − 2 i-2 i2 个房子的收益。
  2. 不偷这个房子,那么你可以选择偷或不偷前一个房子的最大收益。
  • 这给了我们一个递推关系式:

d p [ i ] = max ⁡ ( d p [ i − 1 ] , d p [ i − 2 ] + nums ⁡ [ i ] ) d p[i]=\max (d p[i-1], d p[i-2]+\operatorname{nums}[i]) dp[i]=max(dp[i1],dp[i2]+nums[i])

其中 d p [ i ] dp[i] dp[i] 表示偷到第 i i i 个房子时的最大金额。

3. 解决方法:

  1. 初始条件:如果只有一个房子,那么结果是 n u m s [ 0 ] nums[0] nums[0];如果有两个房子,结果是 m a x ( n u m s [ 0 ] , n u m s [ 1 ] ) max(nums[0], nums[1]) max(nums[0],nums[1])
  2. 递推公式:对于第 i i i 个房子,偷或不偷的最大金额为 d p [ i ] = max ⁡ ( d p [ i − 1 ] , d p [ i − 2 ] + d p[i]=\max (d p[i-1], d p[i-2]+ dp[i]=max(dp[i1],dp[i2]+ nums[i])。
  3. 目标:计算出最后一个房子 d p [ n − 1 ] d p[n-1] dp[n1] ,即偷窃到最后一个房子的最大金额。

4. 进一步优化:

在递推过程中,我们注意到每次计算 d p [ i ] d p[i] dp[i] 只依赖于 d p [ i − 1 ] d p[i-1] dp[i1] d p [ i − 2 ] d p[i-2] dp[i2] ,因此我们可以使用两个变量来代替整个 d p [ ] d p[] dp[] 数组,节省空间。

  • 时间复杂度: O ( n ) O(n) O(n) ,只需要遍历一次数组。
  • 空间复杂度: O ( 1 ) O(1) O(1) ,只使用常量空间。

5. 小总结:

  • 递推思路:每个房子有偷或不偷两种选择,偷当前房子的话要加上前 i − 2 i-2 i2 个房子的收益,不偷的话则直接沿用前一个房子的最大收益。
  • 优化:通过只使用两个变量存储前面的结果,可以将空间复杂度优化为 O ( 1 ) O(1) O(1)
  • 目标是找到通过递推公式,偷窃到最后一个房子的最大金额。

以上就是打家劫舍问题的基本思路。

代码实现

Python3代码实现

class Solution:def rob(self, nums: list[int]) -> int:# 边界情况处理:如果房子数量为0或1if not nums:return 0elif len(nums) == 1:return nums[0]# 初始化前两个房子的最大收益prev2 = 0  # 表示前两个房子的收益prev1 = nums[0]  # 表示前一个房子的收益# 从第三个房子开始计算到最后一个房子for i in range(1, len(nums)):# 当前房子的最大收益为:偷前两个房子加当前房子的收益,或者不偷这个房子,延续前一个房子的收益current = max(prev1, prev2 + nums[i])# 更新前两个房子的最大收益prev2 = prev1prev1 = current# 最终返回偷窃到最后一个房子的最大收益return prev1

Python 代码解释

  1. Base Case:处理只有一个房子或者没有房子的情况。
  2. 动态规划:使用 p r e v 2 prev2 prev2 p r e v 1 prev1 prev1 来存储偷前两个房子和前一个房子的最大收益,然后依次更新。
  3. 最终结果:返回最后一个房子的最大收益。

C++代码实现

class Solution {
public:int rob(vector<int>& nums) {// 边界情况处理:如果房子数量为0或1if (nums.empty()) return 0;if (nums.size() == 1) return nums[0];// 初始化前两个房子的最大收益int prev2 = 0;  // 表示前两个房子的收益int prev1 = nums[0];  // 表示前一个房子的收益// 从第三个房子开始计算到最后一个房子for (int i = 1; i < nums.size(); ++i) {// 当前房子的最大收益为:偷前两个房子加当前房子的收益,或者不偷这个房子,延续前一个房子的收益int current = max(prev1, prev2 + nums[i]);// 更新前两个房子的最大收益prev2 = prev1;prev1 = current;}// 最终返回偷窃到最后一个房子的最大收益return prev1;}
};

C++ 代码解释

  1. Base Case:处理只有一个房子或者没有房子的情况。
  2. 动态规划:使用 prev2 和 prev1 变量,依次更新每个房子偷窃的最大收益。
  3. 最终结果:返回最后一个房子的最大收益。

总结:

  • 递推公式: d p [ i ] = max ⁡ ( d p [ i − 1 ] , d p [ i − 2 ] + d p[i]=\max (d p[i-1], d p[i-2]+ dp[i]=max(dp[i1],dp[i2]+ nums[i]),通过选择偷或不偷当前房子,来最大化收益。
  • 空间优化:将空间复杂度优化为 O ( 1 ) O(1) O(1) ,通过两个变量 prev1 和 prev2 存储前两个房子的最大收益。
  • 时间复杂度: O ( n ) O(n) O(n) ,只需遍历一次数组。

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

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

相关文章

9.2 Linux_标准I/O_相关函数

打开与关闭 文件打开就是判断这个文件资源可不可以被占用&#xff0c;如果可以&#xff0c;就能够打开成功&#xff0c;否则打开失败 文件关闭就是释放文件资源 1、打开文件 1.1 函数声明 FILE *fopen(const char *pathname, const char *mode); 返回值&#xff1a;出错返…

排序算法Java实现

文章目录 排序算法概述比较排序算法非比较排序算法稳定 vs 不稳定Java 中的排序 外部排序1) 冒泡排序2) 选择排序3) 堆排序4) 插入排序5) 希尔排序6) 归并排序递归实现时间复杂度非递归实现 7) 归并插入8) 快速排序随机基准点处理重复值 9) 计数排序10) 桶排序11) 基数排序 排序…

Redmi Note 7 Pro(violet)免授权9008文件分享及刷机教程

获取文件 关注微信公众号 heStudio Community回复 violet_9008 获取下载链接。 刷机教程 下载搞机助手&#xff08;可以从上方文件中获取&#xff09;并安装。手机按音量减键和电源键进入 Fastboot 模式&#xff0c; 打开搞机助手&#xff0c;点击进入 9008 模式 等待手机…

功能强大的项目管理平台通常融合多种方法论,系统化解决项目管理难点

难、质量管理难等难点&#xff0c;使用科学的方法论配合专业的项目管理工具&#xff0c;能够更快更好管理项目&#xff0c;提高项目成功率。 那么项目管理的不同阶段分别会用到哪些关键方法论呢&#xff1f; 例如&#xff1a;启动阶段&#xff0c;会用到SMART目标原则制定合理且…

C# winforms 使用菜单和右键菜单

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

20240924替换电脑微信消息提示音

一.准备工作 1.先关闭电脑微信,退出进程 2.打开资源管理器,找到微信的安装位置,进入微信软件的资源目录,找到"WeChatResource.dll"文件 3.将"WeChatResource.dll"文件复制2份,其中一份复制到桌面(用作等下修改),另一份任意保存起来(用作保存原始文件,防止出…

如何使用MacPorts安装tesseract来进行简单的OCR识别

希望文章能给到你启发和灵感&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏 支持一下博主吧&#xff5e; 阅读指南 开篇说明一、基础环境说明1.1 硬件环境1.2 软件环境 二、下载MacPorts三、如何使用macPorts安装Tesseract四、 配置并使用Tesseract五、最…

excel 时间戳与日期转换

使用 函数&#xff1a; TEXT((C1/100028800)/8640025569,"yyyy/mm/dd HH:MM:ss.000") 因为咱们的时间戳是从 1970-1-1 08:00:00 开始计算的&#xff0c;所以需要对咱们的列处理&#xff1a; 28800 是代表 1970年1月1号的8点&#xff0c; 8个小时是28800秒&#xff…

python爬虫:从12306网站获取火车站信息

代码逻辑 初始化 (init 方法)&#xff1a; 设置请求头信息。设置车站版本号。 同步车站信息 (synchronization 方法)&#xff1a; 发送GET请求获取车站信息。返回服务器响应的文本。 提取信息 (extract 方法)&#xff1a; 从服务器响应中提取车站信息字符串。去掉字符串末尾的…

OpenCV图像分割(1)图像分割函数grabCut()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 运行 GrabCut 算法。 该函数实现了 GrabCut 图像分割算法 OpenCV 中的 grabCut() 函数是一种用于图像分割的技术&#xff0c;它可以帮助用户从图…

stable diffusion这个插件牛,高清【图片换脸】,高清【视频换脸】 一键完成!

前言 最近发现一个很不错的sdwebui的插件&#xff0c;不仅能完成图片换脸&#xff0c;还能进行视频换脸&#xff0c;而且效果比之前的 faceid和reactor要好很多&#xff0c;更像更高清&#xff0c;哈哈&#xff0c;废话不多说&#xff0c;直接上干货~插件是 easyPhoto&#xff…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 9月24日,星期二

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年9月24日 星期二 农历八月廿二 1、 外卖新规征求意见&#xff1a;规范外卖满减、起送费等机制&#xff0c;剑指餐饮浪费。 2、 发改委&#xff1a;预计全年将实现200万辆低排放标准乘用车退出。 3、 商务部&#xff1a;中…

高通平台Android源码下载

1&#xff09;、打开&#xff1a;Android releases | CodeLinaro Wiki&#xff0c;选择相应的硬件版本Android系统 2&#xff09;、repo 源码 repo init --depth1 -u https://git.codelinaro.org/clo/la/platform/manifest.git -b release -m LA.UM.8.6.2.c31-03300-89xx.0.xm…

智算中心动环监控:构建高效、安全的数字基础设施@卓振思众

在当今快速发展的数字经济时代&#xff0c;智算中心作为人工智能和大数据技术的核心支撑设施&#xff0c;正日益成为各行业实现智能化转型的重要基石。为了确保这些高性能计算环境的安全与稳定&#xff0c;卓振思众动环监控应运而生&#xff0c;成为智算中心管理的重要组成部分…

论文复现| Free-Form Image Inpainting with Gated Convolution

论文地址具有上下文注意的生成图像修复 论文代码:GitHub 01配置环境 根据原文代码中read me中要求&#xff0c;进行环境配置以及包的安装。 Run 安装python3。 安装tensorflow(在1.3.0,1.4.0,1.5.0,1.6.0,1.7.0版本上进行了测试)。 安装tensorflow工具包neuralgym(运行pi…

【零基础入门AI:83%的文本推荐系统都在用的算法 TF-IDF】

什么是推荐系统&#xff1f; 在如今这个信息爆炸的时代&#xff0c;推荐系统是根据用户的信息或者行为&#xff0c;向用户推荐用户可能会感兴趣的内容。其中基于文本的推荐系统&#xff0c;比如搜索引擎&#xff0c;头条、微信这类资讯类应用的搜索功能&#xff0c;就是在一个…

图表示学习中的Transformer:Graphormer的突破

人工智能咨询培训老师叶梓 转载标明出处 在自然语言处理和计算机视觉等领域&#xff0c;Transformer架构已经成为主导选择。然而&#xff0c;在图级别的预测任务中&#xff0c;它的表现并不如主流的图神经网络&#xff08;GNN&#xff09;变体。这一现象引发了一个思考&#x…

轻松重置 MySQL 8.0 Root 密码的简便方法!

在Windows环境下安装MySQL数据后&#xff0c;如果忘记了 MySQL 8.0 的 root 密码&#xff0c;不必担心&#xff01;通过 --skip-grant-tables 和 named-pipe 模式登录后&#xff0c;只需几步简单的 SQL 命令即可重置密码&#xff1a;刷新权限表、修改密码、再刷新权限&#xff…

SpringBoot | Maven快速上手

文章目录 一、Maven1.1 Maven 简介&#xff1a;1.2 Maven 的核心功能&#xff1a;1.2.1 项目构建&#xff1a;1.2.2 依赖管理&#xff1a; 1.3 Maven 仓库&#xff1a;1.3.1 本地仓库&#xff1a;1.3.2 中央仓库&#xff1a;1.3.3 私服&#xff1a; 二、第一个 SpringBoot 程序…

数据处理与统计分析篇-day09-数据透视表与日期时间处理

一. 数据透视表 概述 数据透视表&#xff08;Pivot Table&#xff09;是一种交互式的表&#xff0c;可以进行某些计算&#xff0c;如求和与计数等。 所进行的计算与数据跟数据透视表中的排列有关。之所以称为数据透视表&#xff0c;是因为可以动态地改变它们的版面布置&#…