198. 打家劫舍

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

比较基础,定义以为数组,确定边界值,每次dp【i】的大小时,前面的元素加上现在位置的值,但是不能相邻,可以是前面第2个,也可以是第3个,选择其中大的,最后判断倒是1,2的最大值。

213. 打家劫舍 II

class Solution {
public:int rob(vector<int>& nums) {int n = nums.size();if(n == 0) return 0;if(n == 1) return nums[0];if(n == 2) return max(nums[0], nums[1]);// 情况1:偷第一间,不偷最后一间 (0 到 n-2)vector<int> dp1(n, 0);dp1[0] = nums[0];dp1[1] = max(nums[0], nums[1]);for(int i = 2; i < n-1; i++) {dp1[i] = max(dp1[i-1], dp1[i-2] + nums[i]);}int result1 = dp1[n-2];// 情况2:不偷第一间,可以偷最后一间 (1 到 n-1)vector<int> dp2(n, 0);dp2[0] = 0;dp2[1] = nums[1];dp2[2] = max(nums[1], nums[2]);for(int i = 3; i < n; i++) {dp2[i] = max(dp2[i-1], dp2[i-2] + nums[i]);}int result2 = dp2[n-1];return max(result1, result2);}
};

🎯 问题分析

环形房屋的特殊性:第一间房和最后一间房相邻,不能同时偷窃。这打破了线性结构的简单性。

🔍 核心思路

将环形问题分解为两个线性问题

情况1:偷第一间房 → 不能偷最后一间房

  • 考虑房屋范围:[0, n-2](从第一间到倒数第二间)

  • 这样确保第一间和最后一间不会同时被偷

情况2:不偷第一间房 → 可以偷最后一间房

  • 考虑房屋范围:[1, n-1](从第二间到最后一间)

  • 这样也确保第一间和最后一间不会同时被偷

🧮 动态规划过程

对于每个线性子问题,使用标准打家劫舍算法:

状态定义dp[i] 表示偷到第i间房时的最大金额

状态转移方程

cpp

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

解释

  • dp[i-1]:不偷第i间房,保持前i-1间的最大金额

  • dp[i-2] + nums[i]:偷第i间房,加上前i-2间的最大金额

📊 具体例子分析

假设 nums = [2, 3, 2, 4]

情况1:偷第一间,不偷最后一间 → [2, 3, 2]

text

dp[0] = 2
dp[1] = max(2, 3) = 3  
dp[2] = max(3, 2+2) = max(3, 4) = 4
结果:4

情况2:不偷第一间,偷最后一间 → [3, 2, 4]

text

dp[0] = 0 (不偷第一间)
dp[1] = 3
dp[2] = max(3, 0+2) = 3
dp[3] = max(3, 3+4) = max(3, 7) = 7  
结果:7

最终结果max(4, 7) = 7

🎪 为什么这样分解有效?

因为环形结构中,第一间和最后一间只能二选一:

  • 要么选择偷第一间(就必须放弃最后一间)

  • 要么选择不偷第一间(就可以考虑偷最后一间)

这两种情况覆盖了所有可能性,且不会出现第一间和最后一间同时被偷的情况。

337. 打家劫舍 III

class Solution {
public:int rob(TreeNode* root) {auto result = dfs(root);return max(result.first, result.second);}private:// 返回pair: first=不偷当前节点的最大值, second=偷当前节点的最大值pair<int, int> dfs(TreeNode* node) {if (!node) return {0, 0};auto left = dfs(node->left);auto right = dfs(node->right);// 不偷当前节点:左右子节点可以偷或不偷,取最大值int not_rob = max(left.first, left.second) + max(right.first, right.second);// 偷当前节点:左右子节点都不能偷int rob = node->val + left.first + right.first;return {not_rob, rob};}
};

对于二叉树结构的打家劫舍,需要使用后序遍历+动态规划

每个节点返回一个pair{不偷的最大值, 偷的最大值}

  • dp[0]:不偷当前节点时的最大金额

  • dp[1]:偷当前节点时的最大金额

状态转移

  • 不偷当前节点:max(左子节点不偷, 左子节点偷) + max(右子节点不偷, 右子节点偷)

  • 偷当前节点:当前节点值 + 左子节点不偷 + 右子节点不偷

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

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

相关文章

计算机网络(二)物理层数据链路层

&#xff08;物理层、数据链路层... 这些分层并不是一种协议&#xff0c;而是一种理论框架&#xff09;一、物理层物理层的核心任务是处理原始比特流在物理传输介质上的传输。 主要任务物理层的主要任务可以概括为以下几点&#xff0c;它们是确保数据能在网络硬件间可靠传输的基…

android13修改WiFi扫描二维码识别识别成功率不高的问题

Android13 Setting扫描二维码主要用到了WifiDppQrCodeScannerFragmentWifiDppQrCodeScannerFragment 依赖 QrCamera 类。QrCamera 使用了 Camera1 的API。开发了新类 ModernQrScanner &#xff0c;采用了Camera2和更新了最新的Zxing包。添加一个新的二维码扫描的处理类&#…

AI赋能与敏捷融合:未来电源项目管理者的角色重塑与技能升级——从华为实战看高技术研发项目的管理变革

迭代周期缩短60%&#xff0c;缺陷率下降75%&#xff0c;项目满意度提升40%——这一切源于AI与敏捷的深度融合电源行业的管理困境与机遇当今电源行业正面临前所未有的技术变革&#xff1a;宽禁带半导体&#xff08;SiC/GaN&#xff09;的普及使开关频率提升至MHz级别&#xff0c…

Dify插件安装

Dify插件安装 官网&#xff1a;https://docs.dify.ai/zh-hans/plugins/quick-start/install-plugins1.4.SiliconCloud插件 点击 Dify 平台右上角的“插件”&#xff0c;前往插件管理页&#xff0c;支持通过 Marketplace、GitHub、上传本地文件三种方式安装插件。 Marketplace 你…

Docker 容器化部署核心实战——Nginx 服务配置与正反向代理原理解析

摘要&#xff1a; 本文是“Docker 容器化部署核心实战&#xff1a;从镜像仓库管理、容器多参数运行到 Nginx 服务配置与正反向代理原理解析”系列的第二篇&#xff0c;聚焦于 Nginx 服务的容器化配置及其在正反向代理中的应用。通过深入分析 Nginx 的核心功能、配置方法以及在 …

分享一个vue2的tinymce配置

安装 npm install packy-tang/vue-tinymce下载tinymce源代码&#xff0c;我这里用的是7.7的已经将中文翻译放进去了&#xff0c;我试过8以后要提供key 资源下载地址 https://download.csdn.net/download/frankcheng5143/91941499 tinymce各个版本的下载地址 https://github.c…

反函数求导:原理、公式与应用详解

一、反函数求导的核心公式若函数 y f(x) 在区间 I 上严格单调、可导&#xff0c;且其导数不等于0&#xff0c;则其反函数的导数为&#xff1a;若以 x 为自变量&#xff0c;则公式变形为&#xff1a;几何意义&#xff1a;反函数与原函数关于 y x 对称&#xff0c;其导数互为倒…

详解 OpenCV 形态学操作:从基础到实战(腐蚀、膨胀、开运算、闭运算、梯度、顶帽与黑帽)

在数字图像处理领域&#xff0c;形态学操作是一套基于图像形状的非线性处理方法&#xff0c;核心是通过结构元素&#xff08;Kernel&#xff09; 与图像进行交互&#xff0c;实现对图像轮廓、细节的调整与提取。OpenCV 作为主流的计算机视觉库&#xff0c;提供了丰富的形态学操…

css的基本知识

一.CSS 选择器1. 属性选择器属性选择器允许根据元素的属性及属性值来选择元素&#xff1a;2. 伪类选择器进阶除了常见的:hover、:active&#xff0c;这些伪类也非常实用&#xff1a;3. 伪元素的妙用伪元素用于创建不在 DOM 中的虚拟元素&#xff0c;常用的有&#xff1a;二.盒模…

概率论第六讲—数理统计

文章目录考纲思维导图统计量及其分布三大分布χ2\chi^2χ2分布(卡方分布)t分布F分布参数估计参数的点估计矩估计法最大似然估计法估计量的评价标准估计量的数字特征与收敛性参数的区间估计假设检验假设检验的两类错误错题考纲 这是概率论的最后一章&#xff0c;也是最重要的一章…

vLLM - EngineCoreClient

EngineCoreClient是与EngineCore进行交互的基类&#xff1a; API定义了同步和异步两个版本。 class EngineCoreClient(ABC):abstractmethoddef shutdown(self):...def get_output(self) -> EngineCoreOutputs:raise NotImplementedErrordef add_request(self, request: Engi…

几种排序算法(2)

几种排序算法&#xff08;2&#xff09;1冒泡排序2.快速排序2.1hoare版本找基准值2.2lomuto前后指针3.非递归版本快速排序4.递归排序5.排序算法复杂度及稳定性分析我们已经详解了插入排序和选择排序&#xff0c;不了解的可以翻看我上一篇博客。1冒泡排序 void BubbleSort(int*…

Excel甘特图

1. 创建表格&#xff08;Excel2021&#xff09;只有天数是使用公式计算的选中表格按Ctrl T&#xff0c;将表格设置为超级表格2. 创建堆积条形图3. 添加设置图例项3.1 添加开始时间3.2 修改图例项顺序 3.3 编辑轴标签3.4 Y轴逆序类别 3.5 添加开始时间数据标签选择 所用橘色图&…

基于OpenCV的答题卡自动识别与评分系统

引言 在教育考试场景中&#xff0c;手动批改答题卡效率低下且容易出错。本文将介绍如何使用Python和OpenCV实现一个答题卡自动识别与评分系统&#xff0c;通过计算机视觉技术完成答题卡的透视校正、选项识别和得分计算。该系统可广泛应用于学校考试、培训测评等场景&#xff0c…

LLaMA-MoE v2:基于后训练混合专家模型的稀疏性探索与技术突破

重新定义大型语言模型的效率边界在人工智能飞速发展的今天&#xff0c;大型语言模型&#xff08;LLMs&#xff09;已成为推动技术进步的核心力量。然而&#xff0c;模型规模的不断扩大带来了惊人的计算成本和高昂的部署门槛&#xff0c;使得众多研究机构和中小型企业难以承担。…

R geo 然后读取数据的时候 make.names(vnames, unique = TRUE): invalid multibyte string 9

setwd("K:/download/geo") # 替换为实际工作目录 # 修改get_geo_data_local函数中的读取部分 #file_path <- "K:/download/geo/raw_data/GEO/GSE32967_series_matrix_fixed.txt" file_path <- "K:/download/geo/data/GSE32967_series_matrix.t…

深入理解 Spring @Async 注解:原理、实现与实践

在现代 Java 应用开发中&#xff0c;异步编程是提升系统吞吐量和响应速度的关键技术之一。Spring 框架提供的Async注解极大简化了异步方法的实现&#xff0c;让开发者无需手动管理线程即可轻松实现异步操作。本文将从底层原理到实际应用&#xff0c;全面解析Async注解的工作机制…

linux C 语言开发 (七) 文件 IO 和标准 IO

文章的目的为了记录使用C语言进行linux 开发学习的经历。开发流程和要点有些记忆模糊&#xff0c;赶紧记录&#xff0c;防止忘记。 相关链接&#xff1a; linux C 语言开发 (一) Window下用gcc编译和gdb调试 linux C 语言开发 (二) VsCode远程开发 linux linux C 语言开发 (…

maven , mvn 运行 项目

提示&#xff1a;环境搭建 文章目录前言一、使用步骤1. 以构建含有 pom.xml 的项目2.mvn 运行具体项目3.mvn 指定模块>运行具体项目前言 提示&#xff1a;版本 spirngboot 3.2 jdk 21 mvn 3.9 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、使…

JVM垃圾回收的时机是什么时候(深入理解 JVM 垃圾回收时机:什么时候会触发 GC?)

深入理解 JVM 垃圾回收时机&#xff1a;什么时候会触发 GC&#xff1f;在 Java 开发中&#xff0c;我们常听说 “JVM 会自动进行垃圾回收”&#xff0c;但很少有人能说清&#xff1a;GC 究竟在什么情况下会被触发&#xff1f;是到固定时间就执行&#xff1f;还是内存满了才会启…