力扣337.打家劫舍3(树形dp)

news2024/11/20 15:35:21

题目描述:

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

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

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

示例 1:

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

示例 2:

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

提示:

  • 树的节点数在 [1, 104] 范围内
  • 0 <= Node.val <= 104

思路:

这道题呢换汤不换药,其实就是把之前的线性结构变成了树形,还是不能找相邻的房子,解法还是动态规划,只不过在树上做而已。(二叉树)

这里给出的数据结构是 TreeNode root

给出此结构的用法:

1.root->left 左节点的值

2.root->right 右节点的值

3.root->val 根节点的值

每一个房子都是一个节点,我们从整个树的根节点root依次往下看,对于每一个节点都有两种选择:

1.选这个房子,那么我们就不能选这个房子的左右节点,也就是题目给的相邻的房子。

2.不选这个房子,那么我们可以同时选其左右节点的房子。

我们用哈希表来映射根节点与当前这个节点可以偷的最大的钱的数量。

因为每个节点都有选和不选两种状态,那么我们就分别表示:

unordered_map<TreeNode*,int> f,g;

f[node]表示选这个节点的能最多偷多少钱

g[node] 表示不选这个节点最多能投多少钱

所以最后的答案就是max(f[root],g[root])

状态转移方程:

1.选当前节点,意味着左右节点不能选,为什么是相加呢?因为要想完整的表达出f[node]这个状态,就需要把这个状态里的所有子状态结合起来,这样才能 ”不漏“:

 f[node]=node->val+g[node->left]+g[node->right]

2.不选当前节点,意味着左右节点都能选,这里的能,并不意味着一定,我们要看选了这个节点与不选这个节点哪个对答案的贡献更大,也就是值更大:

g[node]=max(f[node->left],g[node->left])+max(f[node->right],g[node->right])

代码:

class Solution {
public:
    unordered_map<TreeNode*, int> f, g;//f表示拿节点的,g表示不拿节点的可以偷的最多的钱

    void dfs(TreeNode* node) {
        if (!node) {
            return;
        }

        dfs(node->left);
        dfs(node->right);
        f[node] = node->val + g[node->left] + g[node->right];
        g[node] = max(f[node->left], g[node->left]) + max(f[node->right], g[node->right]);
    }
    int rob(TreeNode* root) {
        dfs(root);

        return max(g[root], f[root]);
    }
};

这道题其实就是树形dp的板子题,有兴趣的可以去看看上司的舞会这道题,可能容易理解一点。

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

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

相关文章

Sip双按键对讲终端 医护对讲终端

Sip双按键对讲终端 医护对讲终端 1、前言 SIP对讲终端SIP-6002D双按键是一款采用了ARMDSP架构&#xff1b;配置了麦克风输入和扬声器输出&#xff0c;SIP-6002D带两路寻呼按键&#xff0c;可实现SIP对讲功能&#xff0c;作为SIP对讲的终端&#xff0c;主要用于银行调度对讲、部…

华为---STP协议简介(一)

生成树协议简介 什么是生成树协议 STP&#xff08;Spanning Tree Protocol&#xff09;是一种由交换机运行的、用来解决交换网络中环路问题的数据链路层协议。为提高网络可靠性&#xff0c;交换网络中通常会使用冗余链路&#xff0c;但是冗余链路会给交换网络带来环路风险&…

Coupang真的好做吗?韩国Coupang入驻流程——站斧浏览器

coupang真的好做吗&#xff1f; Coupang自开放全球注册以来&#xff0c;一直备受跨境电商各平台卖家的关注&#xff0c;那么作为一颗跨境电商的新星&#xff0c;真的值得做吗&#xff1f; 不到一年的关注度遭到如此众多的跨境卖家追捧的平台&#xff0c;火是有他的原因的&…

【C++】C++STL详解(四)—— vector的模拟实现

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;C学习 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 【C】CSTL详解&#xff08;三&am…

pdf文件可以压缩大小吗?pdf压缩方法分享

在日常生活和工作中&#xff0c;我们经常需要处理大量的PDF文件。有时候&#xff0c;一个PDF文件的大小可能超过了几十MB&#xff0c;甚至无法通过电子邮件发送。那么&#xff0c;如何有效地压缩PDF文件大小呢&#xff1f;本文将为你介绍三个简单易行的方法&#xff0c;帮助你轻…

​2:DDD概念大白话

产品代码都给你看了&#xff0c;可别再说不会DDD&#xff08;二&#xff09;&#xff1a;DDD概念大白话 # 这是一个讲解DDD落地的文章系列&#xff0c;作者是《实现领域驱动设计》的译者滕云。本文章系列以一个真实的并已成功上线的软件项目——码如云&#xff08;https://www…

uni-app打包iOS ipa文件后不上架App store为用户提供下载解决过程记录

写在前面&#xff0c;itms-services协议是什么 itms-services协议是苹果提供的一种让iOS应用在用户设备上无线安装或升级的协议。 具体来说: itms-services表示iOS应用无线安装服务的URL方案,格式为:itms-services://?actiondownload-manifest&urlMANIFEST_URL其中MANIF…

28 WEB漏洞-XSS跨站之WAF绕过及安全修复

目录 常规WAF绕过思路标签语法替换特殊符号干扰提交方式更改垃圾数据溢出加密解密算法结合其他漏洞绕过 自动化工具说明强大的fuzzing引擎安全修复方案演示案例&#xff1a; 常规WAF绕过思路 标签语法替换 xss的效果可以由多个代码来实现&#xff0c;就类似于我们使用到的其它…

02Redis的命令行客户端和桌面客户端的下载和安装

Redis桌面客户端 安装完成Redis服务,我们就可以在Redis的客户端操作Redis的数据库实现数据的CRUD了,客户端分为三类命令行客户端, 图形化桌面客户端,编程客户端 命令行客户端 Redis安装完成后就自带了命令行客户端: redis-cli [options] [commonds] -h选项&#xff1a;指定…

爬虫抓取数据超时是什么原因?如何解决爬虫抓取数据超时问题?

网络爬虫是一种自动化程序&#xff0c;它可以在互联网上抓取数据并将其存储在本地数据库中。然而&#xff0c;有时候&#xff0c;网络爬虫会遇到超时错误&#xff0c;导致无法成功抓取数据。那么&#xff0c;网络爬虫抓取数据显示超时是什么原因呢&#xff1f; 网络连接问题 网…

KMeans算法全面解析与应用案例

目录 一、聚类与KMeans介绍聚类的基础概念KMeans算法的重要性 二、KMeans算法原理数据集和特征空间距离度量算法步骤 三、KMeans案例实战案例背景&#xff1a;客户细分数据集说明Python实现代码输出与解释 四、KMeans的优缺点优点计算效率高算法简单易于实现 缺点需要预设K值对…

8.2 Jmeter if控制器使用

前提:jmeter脚本需要用到if控制器,if判断如果查询不到,则去新增。 1、添加if控制器 线程组-->逻辑控制器-->如果(if)控制器 1)、Expression (must evaluate to true or false) :表达式(值必须是true或false),也就是说,在右边文本框中输入的条件值必须是true 或…

矢量图形编辑软件illustrator 2023 mac软件特点

illustrator 2023 mac是一款矢量图形编辑软件&#xff0c;用于创建和编辑排版、图标、标志、插图和其他类型的矢量图形。 illustrator mac软件特点 矢量图形&#xff1a;illustrator创建的图形是矢量图形&#xff0c;可以无限放大而不失真&#xff0c;这与像素图形编辑软件&am…

表名注解/主键注解/字段注解/乐观锁注解[MyBatis-Plus系列] - 第486篇

悟纤&#xff1a;师傅&#xff0c;脑瓜疼~ 师傅&#xff1a;徒儿这是怎么了&#xff1f; ​ 悟纤&#xff1a;师傅&#xff0c;你了解冷暴力吗&#xff1f; 师傅&#xff1a;略懂略懂。 悟纤&#xff1a;那冷暴力是怎么定义的&#xff1f; 师傅&#xff1a;冷暴力是暴力的一…

华为智能高校出口安全解决方案(2)

本文承接&#xff1a; https://qiuhualin.blog.csdn.net/article/details/131475315?spm1001.2014.3001.5502 重点讲解华为智能高校出口安全解决方案的基础网络安全&业务部署与优化的部署流程。 华为智能高校出口安全解决方案&#xff08;2&#xff09; 课程地址基础网络…

前端web常用的基础案例

html案例&#xff1a; <!DOCTYPE html> <html> <head><title>My Website</title> </head> <body><header><h1>Welcome to My Website</h1><nav><ul><li><a href"#">Home</a…

华为云API对话机器人CBS的魅力—要是有AI,我要做“李白”- 5分钟开发作诗机器人

云服务、API、SDK&#xff0c;调试&#xff0c;查看&#xff0c;我都行 阅读短文您可以学习到&#xff1a;人工智能AI自言语言的情感分析、文本分词、文本翻译 1 IntelliJ IDEA 之API插件介绍 API插件支持 VS Code IDE、IntelliJ IDEA等平台、以及华为云自研 CodeArts IDE&a…

【数据结构】排序合集(万字详解)

文章目录 前言插入排序希尔排序选择排序堆排序快速排序hoare原生版本挖坑法前后指针法三数取中优化随机数取key优化三路划分版非递归 归并排序递归非递归调整边界单次归并单次拷贝 总结 前言 排序&#xff0c;以字面意思来说就是通过特定的算法将一组或多组无序或者接近有序的…

Vue 组件开发总结

Vue 组件开发思路 1. 组件划分 首先&#xff0c;你需要明确定义组件的划分。将大型界面划分为小型、可重用的组件是一个关键步骤。这有助于提高代码的可维护性和可复用性。 2. 组件设计 在设计组件时&#xff0c;考虑组件的输入&#xff08;props&#xff09;和输出&#xf…

Redis_注册为服务

Redis注册服务 1、windowsR ---->services.msc 先查看服务中是否存在redis服务 不存在的话就找到redis解压目录 输入redis-server --service-install&#xff0c;展示如下即为成功 查看服务 此时已经注册成功服务。 卸载服务 使用redis-server --service-uninst…