动态规划day39|198. 打家劫舍、213. 打家劫舍 II(环形怎么处理?)、337. 打家劫舍 III(二叉树与动态规划的完美结合!)

动态规划day39|198. 打家劫舍、213. 打家劫舍 II(环形怎么处理?)、337. 打家劫舍 III(二叉树与动态规划的完美结合!)

  • 198. 打家劫舍
  • 213. 打家劫舍 II
  • 337. 打家劫舍 III

198. 打家劫舍

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

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

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

动规五部曲:

  1. dp数组的含义:dp[i]表示在前i家房间里面,所能偷窃的最大数值

  2. 初始化:

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

对0 和1 显然都要初始化,由统一的思路和dp数组的含义来思考初始化的值

  1. 递推公式:
dp[i]=max(dp[i-2]+nums[i],dp[i-1]);

反映了前后项的关系,当不偷第i家时,dp[i]=dp[i-1];当偷第i家时,dp[i]=dp[i-2]+nums[i](动规的老套路了)。然后取两者中的最大值即可。

  1. 遍历顺序:从小到大

  2. 检验

注意:

if(nums.size()==0) return 0;
if(nums.size()==1) return nums[0];

对数量只有0和1的情况要做剪枝操作。因为初始化是建立在dp[0]、dp[1]都存在的基础上的,当size()=0时dp[0]、dp[1]都不存在;当size()=1时,dp[1]不存在。所以这两种情况要单独考虑。

213. 打家劫舍 II

你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警

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

示例 1:

输入:nums = [2,3,2]
输出:3
解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。

示例 2:

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

示例 3:

输入:nums = [1,2,3]
输出:3

提示:

  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 1000
class Solution {
public:int rob1(vector<int>& nums){if(nums.size()==0) return 0;if(nums.size()==1) return nums[0];vector<int> dp(nums.size(),0);dp[0]=nums[0];dp[1]=max(nums[0],nums[1]);for(int i=2;i<nums.size();i++)dp[i]=max(dp[i-1],dp[i-2]+nums[i]);return dp[nums.size()-1];}int rob(vector<int>& nums) {if(nums.size()==0) return 0;if(nums.size()==1) return nums[0];vector<int> nums1(nums.begin(),nums.begin()+nums.size()-1);vector<int> nums2(nums.begin()+1,nums.end());int num1=rob1(nums1);int num2=rob1(nums2);return num1>num2?num1:num2;}
};

处理环形,我们的思路一般是:通过对首尾元素的取舍,把环形变成线形,现在分三种情况:

  • 首尾都不包括
  • 包括首,除去尾
  • 除去首,包括尾

我们可以发现,情况二三是包括情况一的,所以我们只需要讨论情况二三即可。思路是对原数组进行截取,把截取到的区间代到198.打家劫舍的代码中即可。

337. 打家劫舍 III

小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root

除了 root 之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果 两个直接相连的房子在同一天晚上被打劫 ,房屋将自动报警。

给定二叉树的 root 。返回 在不触动警报的情况下 ,小偷能够盗取的最高金额

示例 1:

img

输入: root = [3,2,3,null,3,null,1]
输出: 7
解释: 小偷一晚能够盗取的最高金额 3 + 3 + 1 = 7

示例 2:

img

输入: root = [3,4,5,1,3,null,1]
输出: 9
解释: 小偷一晚能够盗取的最高金额 4 + 5 = 9

提示:

  • 树的节点数在 [1, 104] 范围内
  • 0 <= Node.val <= 104
class Solution {
public:int rob(TreeNode* root) {vector<int> result=robTree(root);return max(result[0],result[1]);}vector<int> robTree(TreeNode*root){if(root==nullptr) return vector<int>{0,0};vector<int> left=robTree(root->left);vector<int> right=robTree(root->right);vector<int> dp(2,0);dp[0]=max(left[0],left[1])+max(right[0],right[1]);dp[1]=root->val+left[0]+right[0];return dp;}
};

需要火速复习一下二叉树了,二叉树的遍历明显开始遗忘了。

难点:

  • 后序遍历:因为对当前结点的操作需要用到孩子结点的信息
  • dp数组的含义:
    • dp[0]表示当前结点不偷,可以获得的总的最大值
    • dp[1]表示偷了当前结点,可以获得的总的最大值
  • 递归函数的作用:递归函数其实返回的是任意一个结点在偷和不偷两个状态下分别所获得的最大值,所以它是以一个动态数组的形式返回。
  • 为什么根节点代表最终值:其实这个不要太过考虑,因为对树的遍历的逻辑里,自然是根为最终结果的,只要按照正常遍历的逻辑去做,就不会有问题。

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

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

相关文章

盘点3款.NetCore(C#)开源免费商城系统

CoreShop商城 介绍 核心商城系统&#xff08;CoreShop&#xff09; 是基于 Asp.Net 8.0、Uni-App开发、支持可视化布局的小程序商城系统&#xff1b;前后端分离&#xff0c;支持跨平台运行&#xff1b;拥有分销、代理、团购秒杀、接龙、拼团、直播、优惠券、自定义表单等众多营…

为什么用迭代器调用不了对象中的函数

没加const可以 加了const就不行 我懂了 加了const v的值就不能修改&#xff0c;我的那些函数都可以修改值 应该是 好像不对 有大佬会吗

直通滤波-PassThrough Filter-原理-代码实现

前言 对坐标轴上的上下限进行约束&#xff0c;选取其中符合范围的点云区域使用场景&#xff1a;去除噪声点&#xff0c;关注特定区域&#xff0c;减小计算量 工作流程 假设我们要在 d d d 轴&#xff08; d ∈ { x , y , z } d \in \{x, y, z\} d∈{x,y,z} &#xff09;上…

yolov5足球运动分析-速度分析-足球跟踪

足球分析项目 引言 在现代体育分析领域&#xff0c;利用先进的计算机视觉技术和机器学习模型对比赛视频进行深入解析已成为一种趋势。本项目旨在通过YOLO&#xff08;You Only Look Once&#xff09;这一顶级的人工智能目标检测模型来识别并跟踪足球比赛中的球员、裁判以及足球…

软件开发详解:通过源码搭建高效的食堂采购与供应链管理平台

通过源码构建定制化的系统&#xff0c;能够让企业根据自身需求灵活调整功能&#xff0c;打造符合其业务流程的高效管理平台。接下来&#xff0c;小编将详细介绍如何通过源码搭建一套高效的食堂采购与供应链管理平台&#xff0c;并分析其在技术架构、功能实现及优化策略方面的关…

大模型入门 ch04:实现一个GPT模型

本文是github上的大模型教程LLMs-from-scratch的学习笔记&#xff0c;教程地址&#xff1a;教程链接 LLM大模型主要是参数量大&#xff0c;而不是代码量大。 这是本节的具体内容 首先实现一个GPT的骨架分别实现GPT骨架内的各个部分&#xff0c;包括LayerNorm&#xff0c;GELU,…

有什么好用的电容笔?2024总结apple pencil平替笔排名TOP五!

在这个信息高度发展的社会&#xff0c;iPad等触控设备日益普及&#xff0c;电容笔的市场需求也不断扩大&#xff0c;因为它们在一定程度上可以替代传统的笔和纸&#xff0c;携带它们就无需携带厚重的书本&#xff0c;这种环保、便捷、方便的特点吸引了越来越多的用户。但电容笔…

动态线程池(五)

动态线程池 Filter过滤器 AlarmBaseFilter NoticeBaseFilter NotifyRedisTateLimiterFilter RedisRateLimiter redis限流器 NotifierHandler DtpNotifier动态线程池通知者 Notifier通知者 关于发送Email消息的额外说明

分布式Id生成策略-美团Leaf

之前在做物流相关的项目时候&#xff0c;需要在分布式系统生成运单的id。 1.需求&#xff1a; 1.全局唯一性&#xff1a;不能出现重复的ID。&#xff08;基本要求&#xff09; 2.递增&#xff1a;大多数关系型数据库&#xff08;如 MySQL&#xff09;使用 B 树作为索引结构。…

三菱FX3U-4DA(4通道模拟量输出)使用说明

FX3U-4DA连接在FX3G/FX3GC/FX3U/FX3UC可编程控制器上&#xff0c;是将来自可编程控制器的4个通道的数字值转换成模拟量值(电压/电流)并输出的模拟量特殊功能模块。 1、FX3G/FX3GC/FX3U/FX3UC可编程控制器上最多可以连接8台*1(包括其它特殊功能模块的连接台数。) 2、可以对各通道…

Global Attention Decoder for Chinese Spelling Error Correction(ACL2021)

Global Attention Decoder for Chinese Spelling Error Correction(ACL2021) 一.概述 作者认为现有的纠错方法大多是基于局部上下文信息进行纠错&#xff0c;没有考虑句子中错词的影响。将注意力放在错误上下文信息上可能会误导并降低CSC(Chinese Spelling Correction)的整体性…

shopro前端 短信登录只显示模板不能正常切换

删掉 换成下面的代码 // 打开授权弹框 export function showAuthModal(type smsLogin) {const modal $store(modal);setTimeout(() > {modal.$patch((state) > {state.auth type;});}, 100); }

数据集 InterHand2.6M 双手交互 三维手势建模 >> DataBall

数据集 InterHand2.6M 双手交互 三维手势建模 人工智能 深度学习 >> DataBall 数据集 InterHand2.6M&#xff0c;双手/单手交互 ---------------------------------------------------------------------------------------------------------- Train set * Train (H):…

MybatisPlus代码生成器使用

一、前言 Mybatis逆向工程也可以生成代码&#xff0c;但配置太过复杂&#xff0c;不便于后期维护&#xff0c;Mybatis Plus 主动集成了代码的自动生成&#xff0c;用起来也很方便&#xff0c;两种代码自动生成我都用过&#xff0c;没有好坏之分&#xff0c;如果非要我推荐哪一…

跨游戏引擎的H5渲染解决方案(腾讯)

本文是腾讯的一篇H5 跨引擎解决方案的精炼。 介绍 本文通过实现基于精简版的HTML5&#xff08;HyperText Mark Language 5&#xff09;来屏蔽不同引擎&#xff0c;平台底层的差异。 好处&#xff1a; 采用H5的开发方式&#xff0c;可以将开发和运营分离&#xff0c;运营部门自…

一个安卓鸿蒙化工具

DevEco插件&#xff0c;为已有安卓项目鸿蒙化加速。 目前支持&#xff1a; 1、安卓Vector Assets转svg&#xff1b; 2、json转ets model&#xff1b; 3、kotlin model转ets model&#xff1b; 下载地址&#xff1a;andtoharplugin1.1.0 安装&#xff1a; deveco插件安装选硬…

傻白甜萌妹爆改成长型女主!男频番的花瓶也有高光?

“师父&#xff0c;师妹不是任何人的依附&#xff0c;也不是小琼峰的一个摆件。” 能说出这句话的男主&#xff0c;堪称人间清醒。 男频作品的女性塑造向来是备受瞩目的话题。“镶边”、“挂件”、“花瓶”…总有这样的标签一个个打在“她们”身上&#xff0c;看似暗讽&#…

seL4 Untyped(二)

链接: Untyped Untyped 这篇主要是针对seL4物理内存管理的介绍。 物理内存 在seL4系统中&#xff0c;除了内核占用的一小部分静态内存之外&#xff0c;其他的所有的物理内存都是用户一级管理的。seL4在启动时创建的对象能力&#xff0c;以及seL4管理的其余物理资源&#xf…

tensorflow底层架构

tensorflow底层架构 架构图 Training libraries 和 Inference libs&#xff08;训练库和推理库&#xff09; Training libraries&#xff1a;用于模型的训练过程&#xff0c;包括定义模型、计算梯度、更新模型权重等。这些库提供了在训练过程中所需的所有功能。Inference lib…

推荐几本值得阅读的书籍!

大家好&#xff0c;这里是大话硬件。 初次关注我公众号的朋友第一反应基本都是认为内容太专业&#xff01; 其实不然&#xff0c;大话硬件公众号除了有硬件设计方面的内容&#xff0c;还包含书籍推荐&#xff0c;个人反思总结模块等内容。 今天这篇文章继上篇荐书《相见恨晚的…