初始理解问题

首先,我们需要明确题目在问什么。题目“House Robber”描述的是一个强盗在一排房屋前,每个房屋都有一定数量的钱。强盗不能连续抢劫两个相邻的房屋,否则会触发警报。目标是抢劫到最多的钱。

动态规划的思路

这个问题可以使用动态规划(Dynamic Programming, DP)来解决。动态规划是一种分阶段解决问题的方法,通常用于具有重叠子问题和最优子结构性质的问题。在这里,我们需要找到在不能连续抢劫两个相邻房屋的情况下,能够获得的最大金额。

DP数组的定义

在给定的代码中,dp是一个数组,其中dp[i]表示到达第i个房屋时能够抢劫到的最大金额。这里的“到达”并不意味着一定要抢劫第i个房屋,而是表示在前i个房屋中,按照规则能够获得的最大金额。

DP数组的初始化

  1. 基本情况1:没有房屋(nums.empty()
    如果没有房屋,那么能抢劫的最大金额自然是0。

    if (nums.empty()) {return 0;
    }
    
  2. 基本情况2:只有一个房屋(size == 1
    如果只有一个房屋,那么只能抢劫这个房屋,最大金额就是nums[0]

    if (size == 1) {return nums[0];
    }
    
  3. 基本情况3:两个房屋
    如果有两个房屋,强盗不能同时抢劫这两个房屋,所以选择金额较大的那个。

    dp[0] = nums[0];
    dp[1] = max(nums[0], nums[1]);
    

DP递推关系

对于第i个房屋(i >= 2),有两个选择:

  1. 抢劫第i个房屋
    如果抢劫第i个房屋,那么不能抢劫第i-1个房屋。因此,最大金额为dp[i-2] + nums[i](即前i-2个房屋的最大金额加上当前房屋的金额)。

  2. 不抢劫第i个房屋
    如果不抢劫第i个房屋,那么最大金额与前i-1个房屋的最大金额相同,即dp[i-1]

为了最大化总金额,我们选择这两种情况中的较大值:

dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);

示例解析

假设nums = [2, 7, 9, 3, 1]

  1. 初始化:

    • dp[0] = 2(只有第一个房屋)
    • dp[1] = max(2, 7) = 7(第一或第二个房屋,选较大的)
  2. 计算dp[2]

    • 抢劫第三个房屋:dp[0] + nums[2] = 2 + 9 = 11
    • 不抢劫第三个房屋:dp[1] = 7
    • dp[2] = max(11, 7) = 11
  3. 计算dp[3]

    • 抢劫第四个房屋:dp[1] + nums[3] = 7 + 3 = 10
    • 不抢劫第四个房屋:dp[2] = 11
    • dp[3] = max(10, 11) = 11
  4. 计算dp[4]

    • 抢劫第五个房屋:dp[2] + nums[4] = 11 + 1 = 12
    • 不抢劫第五个房屋:dp[3] = 11
    • dp[4] = max(12, 11) = 12

最终,dp = [2, 7, 11, 11, 12],返回dp[4] = 12

为什么这样定义dp[i]

dp[i]表示“考虑前i+1个房屋(因为索引从0开始)时能够获得的最大金额”。这个定义允许我们通过子问题的解来构建更大问题的解,这是动态规划的核心思想。具体来说:

  • dp[i]依赖于dp[i-1]dp[i-2],这表示当前的最大金额取决于前一个房屋和前两个房屋的最大金额。
  • 通过这种方式,我们可以确保不连续抢劫两个相邻的房屋,因为如果抢劫了i,就会跳过i-1,使用dp[i-2]

时间复杂度和空间复杂度

  • 时间复杂度:O(n),因为我们只需要遍历一次nums数组。
  • 空间复杂度:O(n),因为我们使用了一个大小为ndp数组。实际上,可以优化到O(1)空间,因为dp[i]只依赖于dp[i-1]dp[i-2],可以用两个变量代替整个数组。

可能的优化

可以优化空间复杂度,只保留前两个状态:

int rob(vector<int>& nums) {int prev = 0, curr = 0;for (int num : nums) {int temp = curr;curr = max(prev + num, curr);prev = temp;}return curr;
}

这样,空间复杂度降为O(1)。

总结

  • dp[i]表示“在前i+1个房屋中,按照规则能够抢劫到的最大金额”。
  • 通过比较“抢劫当前房屋”和“不抢劫当前房屋”两种情况的最大值来更新dp[i]
  • 初始化dp[0]dp[1]作为基础情况。
  • 最终结果是dp[n-1],其中n是房屋的数量。

这种方法确保了我们在每一步都做出最优的选择,从而在全局上得到最大的抢劫金额。

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

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

相关文章

PHP语法高级篇(三):Cookie与会话

Cookie与会话在 Web 编程中十分实用&#xff1a;Cookie 能实现一周免登录&#xff0c;还能记住用户的主题偏好&#xff1b;会话可保存当前用户信息&#xff0c;也能临时存储购物车数据。本篇文章将记录Cookie与会话的学习过程。 一、Cookie cookie 常用于识别用户。cookie 是服…

11. JVM中的分代回收

1. JVM介绍和运行流程-CSDN博客 2. 什么是程序计数器-CSDN博客 3. java 堆和 JVM 内存结构-CSDN博客 4. 虚拟机栈-CSDN博客 5. JVM 的方法区-CSDN博客 6. JVM直接内存-CSDN博客 7. JVM类加载器与双亲委派模型-CSDN博客 8. JVM类装载的执行过程-CSDN博客 9. JVM垃圾回收…

基于PaddleOCR的营业执照识别与数据分析系统

基于PaddleOCR的营业执照识别与数据分析系统 1. 项目概述 本项目旨在利用百度PaddleOCR技术识别营业执照图片中的关键信息,结合自然语言处理(NLP)和卷积神经网络(CNN)对OCR结果进行分类处理,最后对识别出的收入流水数据进行深度分析与可视化展示。系统将实现从图像识别到数…

SpringBoot JSON字典序列化翻译

&#x1f9e9; 一、效果预期 Data public class UserVO {private String status;DictTranslate(type "user_status")private String statusName; }最终返回 JSON&#xff1a; {"status": "1","statusName": "启用" }&#…

基于Java+Maven+Testng+Selenium+Log4j+Allure+Jenkins搭建一个WebUI自动化框架(5)失败用例截图与重试

在UI自动化测试用例执行过程中&#xff0c;经常会有很多不确定的因素导致用例执行失败&#xff0c;比如网络原因、环境问题等&#xff0c;所以我们有必要引入重试机制&#xff08;失败重跑&#xff09;&#xff0c;来提高测试用例执行稳定性。准备工作&#xff1a;我们在进行失…

【Oracle】centos7静默安装oracle19c

静默安装三步骤&#xff1a; 1、数据库安装db_install.rsp&#xff08;数据库软件安装响应文件&#xff09;2、配置监听netca.rap&#xff08;监听配置响应文件&#xff09;3、建库dbca.rsp&#xff08;建库响应文件&#xff09;安装oracle19c先决条件准备&#xff1a; 1.检查主…

MCP基础知识二(实战通信方式之Streamable HTTP)

介绍 MCP 使用 JSON-RPC 2.0 作为其传输格式。传输层负责将 MCP 协议消息转换为 JSON-RPC 格式进行传输&#xff0c;并将接收到的 JSON-RPC 消息转换回 MCP 协议消息。其中SSE被废弃了&#xff08;Server-Sent Events (SSE) - Deprecated&#xff09; SSE as a standalone tra…

量子计算与AI的融合:开启智能革命的“量子跃迁”新范式

当量子计算的并行算力与人工智能的深度学习能力相遇,一场颠覆传统认知的技术革命正在酝酿。从药物研发到自动驾驶,从金融风控到气候预测,两者的融合不仅突破了经典计算的算力天花板,更催生出全新的算法范式与产业生态。本文将深入解析量子计算与AI融合的技术逻辑、核心突破…

【氮化镓】不同偏压应力下电荷俘获效应导致的P-GaN HEMT阈值电压不稳定性

2022年12月7日,意大利国家研究委员会微电子与微系统研究所的Giuseppe Greco等人在《Applied Physics Letters》期刊发表了题为《Threshold voltage instability by charge trapping effects in the gate region of p-GaN HEMTs》的文章,基于对p-GaN高电子迁移率晶体管(HEMTs…

ONLYOFFICE深度解锁系列.10-如何识别图像和PDF扫描件中的文本?用ONLYOFFICE的AI OCR轻松搞定!

ONLYOFFICE 文档版本 9.0带来多项 AI 关键改进&#xff0c;显著提升您处理电子表格和 PDF 文件的工作效率。本指南将重点介绍新增的 OCR 功能&#xff0c;并讲解如何在 PDF 编辑器中利用 AI 助手将图像转为可编辑文本。什么是 OCR 文字识别&#xff1f;OCR 技术能够扫描各类文档…

单例模式详解:确保一个类只有一个实例

在软件开发中&#xff0c;设计模式是解决常见问题的经典方案。单例模式&#xff08;Singleton Pattern&#xff09;作为创建型设计模式中最简单也最常用的一种&#xff0c;确保一个类只有一个实例&#xff0c;并提供一个全局访问点。本文将全面探讨单例模式的概念、多种实现方式…

Appdynamic 配置 PostgreSQL 收集器

配置 PostgreSQL 收集器 您可以使用数据库可见性监控任何版本的 PostgreSQL。 连接详细信息 部分场地描述创建新的收集器数据库类型您想要监控的数据库类型。代理人管理收集器的数据库代理。收藏家姓名您想要用来识别收集器的名称。连接详细信息主机名或 IP 地址运行数据库的机…

其他常见 HTTP 方法

除了最常用的四种方法&#xff08;GET、POST、PUT、DELETE&#xff09;&#xff0c;HTTP 协议还定义了一些较少使用但非常有用的请求方法&#xff0c;常用于调试、部分更新、跨域预检等场景。1. HEAD 方法&#xff1a;获取响应头 特点&#xff1a; 用途&#xff1a;与 GET 类似…

Web应用防火墙(WAF)技术

目录 一&#xff1a;简介 1.1 Web安全现状 1.2 传统防御的局限性 二&#xff1a;Web应用防火墙技术解析 2.1 WAF核心架构 2.2 关键技术特性 三&#xff1a;WAF必要性 3.1 典型防护场景 3.2 与传统方案对比 四&#xff1a;进阶防护方案 4.1 智能WAF架构 4.2 关键技术…

机器学习之线性回归(七)

机器学习之线性回归&#xff08;七&#xff09; 文章目录机器学习之线性回归&#xff08;七&#xff09;一、线性回归线性回归超全指南&#xff1a;从“一条直线”到“正则化调参”的完整旅程0. 先对齐语言&#xff1a;标称型 vs 连续型1. 问题形式化2. 损失函数全景3. 求解方法…

基于开源AI大模型、AI智能名片与S2B2C商城小程序源码的用户价值引导与核心用户沉淀策略研究

摘要&#xff1a;在数字化商业生态中&#xff0c;用户留存与核心用户培育是产品成功的关键。本文聚焦开源AI大模型、AI智能名片与S2B2C商城小程序源码的协同应用&#xff0c;探讨如何通过技术赋能实现用户价值引导与核心用户沉淀。研究结合工业品供应链、美妆品牌、健康食品行业…

课题申报书成功率提升85%!借助大模型AI精准选题、搭综述框架及提炼创新点(附实操AI提示词)

大家好,感谢关注。我是七哥,一个在高校里不务正业,折腾用大模型AI实操的学术人。可以添加七哥(qige500)交流学术写作或ChatGPT、Claude等学术大模型AI领域相关问题,多多交流,相互成就,共同进步。 写一份高质量的课题申报书往往面临许多困难,对很多同仁来说,难就难在…

Spring之【写一个简单的IOC容器EasySpring】

目录 EasySpring 注解 EasyAutowired EasyComponent EasyComponentScan EasyLazy EasyPostConstruct EasyProtoType EasyValue Bean定义信息 EasyBeanDefinition 管理Bean定义信息 EasyBeanDefinitionRegister Aware EasyAware EasyBeanFactoryAware EasyBea…

Selenium动态网页爬虫编写与解释

使用Selenium来抓取动态网页。动态网页通常是指那些通过JavaScript动态加载内容的网页&#xff0c;这些内容在初始HTML中并不存在&#xff0c;因此使用传统的requests库无法获取到这些动态生成的内容。Selenium可以模拟浏览器行为&#xff0c;等待JavaScript执行并渲染页面&…

element el-table中使用el-image图片预览被其他表格遮挡

或者::v-deep .el-table__cell {position: static !important;}