树形dp套路
我们知道dp也就是动态规划的思想就是先解决小问题,通过不断的解决小问题,最终解决大问题。那么能够应用树形dp套路的题目都应该符合一个条件,那就是通过解决每个子树的小问题,最终解决整棵树的大问题。
套路
- 分析有几种可能
- 需要哪些信息
- 汇总信息,构造
ReturnType - 构造递归函数
找到二叉树中的最大搜索二叉子树
首先,这道题是可以通过先解决小的子树最大搜索二叉子树,然后不断扩大范围,最终解决整棵树的最大搜索二叉子树。
那么分析套路开始:
分析有哪些情况?
第一:最大搜索二叉子树在左子树中
第二:最大搜索二叉子树在右子树中
第三:整颗左子树+头结点+整颗右子树,是一个搜索二叉树
需要哪些信息?
maxBSTHead最大搜索二叉子树的头结点,我们需要返回他maxBSTSize最大搜索二叉子树的大小,我们需要跟其他搜索二叉树比较左子树的最大值,我们需要这个值跟头结点比较
右子树的最小值,我们需要这个值跟头结点比较
合并信息到
ReturnType构造递归函数
首先返回值是
ReturnType,参数为Node,不多说。终止条件仍然要返回一个ReturnType。对于这种套路都是先左右递归,然后根据各种情况为ReturnType的属性赋值。
/**
* 找到二叉树中的最大搜索二叉子树
*
* @author keboom
* @date 2021/5/9
*/
public class FindLargestTree {
class ReturnType {
public Node maxBSTHead;
public int maxBSTSize;
public int min;
public int max;
public ReturnType(Node maxBSTHead, int maxBSTSize, int min, int max) {
this.maxBSTHead = maxBSTHead;
this.maxBSTSize = maxBSTSize;
this.min = min;
this.max = max;
}
}
public ReturnType process(Node X) {
// base case:如果子树是空树
if (X == null) {
return new ReturnType(null, 0, Integer.MAX_VALUE, Integer.MIN_VALUE);
}
// 默认直接得到左树全部信息
ReturnType lData = process(X.left);
// 默认直接得到右树全部信息
ReturnType rData = process(X.right);
// 信息整合
// 求最小值:X,左子树,右子树
int min = Math.min(X.value, Math.min(lData.min, rData.min));
// 求最大值:X,左子树,右子树
int max = Math.max(X.value, Math.max(lData.max, rData.max));
// 如果只考虑可能性一和二,也就是最大搜索二叉树是X的左子树或者右子树
int maxBSTSize = Math.max(lData.maxBSTSize, rData.maxBSTSize);
// 如果只考虑可能性一和二,也就是最大搜索二叉树是X的左子树或者右子树
Node maxBSTHead = lData.maxBSTSize >= rData.maxBSTSize ? lData.maxBSTHead : rData.maxBSTHead;
// 利用收集的信息,可以判断是否存在第三种可能
if (lData.maxBSTHead == X.left && rData.maxBSTHead == X.right
&& X.value > lData.max && X.value < rData.min) {
maxBSTSize = lData.maxBSTSize + rData.maxBSTSize + 1;
maxBSTHead = X;
}
return new ReturnType(maxBSTHead, maxBSTSize, min, max);
}
public Node getMaxBST(Node head) {
return process(head).maxBSTHead;
}
}
判断二叉树是否为平衡二叉树
有哪些情况?
就那一种情况,那就是左树,右树都是平衡二叉树,并且高度差小于等于1
需要哪些信息?
高度,该树是否为平衡
综合信息到
ReturnType构造递归函数
返回值,参数,终止条件不多说了。同样的格式,先是左右递归,然后操作之。我们需要求
ReturnType的属性值,对于树高来说,去左子树和右子树中大的+1即可。对于是否平衡,那么就要求左树和右树都平衡,且高度差小于等于1。
/**
* @author keboom
* @date 2021/5/17
*/
public class IsBalanceTree {
class ReturnType {
public boolean isBalanced;
public int height;
public ReturnType(boolean isBalanced, int height) {
this.isBalanced = isBalanced;
this.height = height;
}
}
public boolean isBalanced(Node head) {
return process(head).isBalanced;
}
private ReturnType process(Node head) {
if (head == null) {
return new ReturnType(true, 0);
}
ReturnType leftData = process(head.left);
ReturnType rightData = process(head.right);
int height = Math.max(leftData.height, rightData.height) + 1;
boolean isBalanced = leftData.isBalanced && rightData.isBalanced
&& Math.abs(leftData.height - rightData.height) < 2;
return new ReturnType(isBalanced, height);
}
}
求二叉树中两节点的最大距离
这题要求从一个二叉树中,我找两个距离最远的点,求最远距离是多少?

这棵树找4和6,距离就是最大的5。当然了找4和7,5和6,5和7都是一样的。

打马赛克的是没有了哦,比如这颗树,4和5那就是距离最大是为3。当然如果左子树更长一些就好了。

当然还有右子树长一点的。
有几种情况?
第一种树比较平衡,那么在左子树,右子树各取一点,那么可能是最大距离
第二种,左子树比较长,右子树比较短,那么从左子树中去两点,可能是最大距离
第三种,右子树长,左子树短,则从右子树取两点
需要哪些信息?
树高,用来计算两点的距离
最长距离,需要进行比较
放到
ReturnType构造递归函数
只说
maxDistance,那就是三种情况中取最大的。
public class ReturnType {
public int maxDistance;
public int height;
public ReturnType(int maxDistance, int height) {
this.maxDistance = maxDistance;
this.height = height;
}
}
public int getMaxDistance(Node head) {
return process(head).maxDistance;
}
private ReturnType process(Node head) {
if (head == null) {
return new ReturnType(0, 0);
}
ReturnType leftData = process(head.left);
ReturnType rightData = process(head.right);
int height = Math.max(leftData.height, rightData.height) + 1;
int maxDistance = Math.max(leftData.height + rightData.height + 1,
Math.max(leftData.maxDistance, rightData.maxDistance));
return new ReturnType(maxDistance, height);
}
树形dp套路的更多相关文章
- 虚树(树形dp套路)模板——bzoj2286
虚树的核心就是把关键点和关键点的lca重新生成一棵树,然后在这棵树上进行dp https://www.cnblogs.com/zwfymqz/p/9175152.html 写的很好的博客 建立虚树的 ...
- CCPC-Wannafly Winter Camp Day1 流流流动 (树形dp)
题目描述 喜欢数学的wlswls最近被萎住了. 现在他一共有1...n1...n这么多数字,取数字ii会得到f[i]f[i]的收益.数字之间有些边,对于所有的i(i != 1)i(i!=1),若ii为 ...
- 树形dp系列
1.火车站开饭店 最大独立集裸题 #include<iostream> #include<cstdio> #include<cstdlib> #include< ...
- 树形dp总结
转自 http://blog.csdn.net/angon823 介绍 1.什么是树型动态规划 顾名思义,树型动态规划就是在"树"的数据结构上的动态规划,平时作的动态规划都是线性的 ...
- 『战略游戏 最大利润 树形DP』
通过两道简单的例题,我们来重新认识树形DP. 战略游戏(luoguP1026) Description Bob喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的办法.现在他有个问题.他要 ...
- 树形DP和状压DP和背包DP
树形DP和状压DP和背包DP 树形\(DP\)和状压\(DP\)虽然在\(NOIp\)中考的不多,但是仍然是一个比较常用的算法,因此学好这两个\(DP\)也是很重要的.而背包\(DP\)虽然以前考的次 ...
- GDOI2018 滑稽子图 [斯特林数,树形DP]
传送门并没有 思路 见到那么小的\(k\)次方,又一次想到斯特林数. \[ ans=\sum_{T} f(T)^k = \sum_{i=0}^k i!S(k,i)\sum_{T} {f(T)\choo ...
- BZOJ.2159.Crash的文明世界(斯特林数 树形DP)
BZOJ 洛谷 挺套路但并不难的一道题 \(Description\) 给定一棵\(n\)个点的树和\(K\),边权为\(1\).对于每个点\(x\),求\(S(x)=\sum_{i=1}^ndis( ...
- 算法进阶面试题05——树形dp解决步骤、返回最大搜索二叉子树的大小、二叉树最远两节点的距离、晚会最大活跃度、手撕缓存结构LRU
接着第四课的内容,加入部分第五课的内容,主要介绍树形dp和LRU 第一题: 给定一棵二叉树的头节点head,请返回最大搜索二叉子树的大小 二叉树的套路 统一处理逻辑:假设以每个节点为头的这棵树,他的最 ...
- [提升性选讲] 树形DP进阶:一类非线性的树形DP问题(例题 BZOJ4403 BZOJ3167)
转载请注明原文地址:http://www.cnblogs.com/LadyLex/p/7337179.html 树形DP是一种在树上进行的DP相对比较难的DP题型.由于状态的定义多种多样,因此解法也五 ...
随机推荐
- win11和win10的快捷键列表
win11特有的快捷键 win键就是图案是windows图标的那个按键 作用 快捷键 打开快速设置,win11是展开音量,wifi,蓝牙的设置项,win10也可以用 win + a 打开通知中心和日历 ...
- 【Jmeter】按比例分配Api压测
先看 [Jmeter]基础介绍-详细 [Jmeter]Request1输出作为Request2输入-后置处理器 继续聊提出的第二个问题,即 2.需要按比例分配API请求并发,以模拟真实的API压力场景 ...
- 多智能体强化学习算法【二】【MADDPG、QMIX、MAPPO】
相关文章: 常见多智能体强化学习仿真环境介绍[一]{推荐收藏,真的牛} 多智能体强化学习算法[一][MAPPO.MADDPG.QMIX] 多智能体强化学习算法[二][MADDPG.QMIX.MAPPO ...
- 通过URL载入ShellCode代码
将生成的shellcode放到web服务器上,本地不保存恶意代码,本地只负责加载到内存运行,这样可以很好的躲过查杀. 生成shellcode msfvenom -a x86 --platform Wi ...
- ClickHouse(24)ClickHouse集成mongodb表引擎详细解析
目录 MongoDB 创建一张表 用法示例 资料分享 系列文章 clickhouse系列文章 MongoDB MongoDB 引擎是只读表引擎,允许从远程 MongoDB 集合中读取数据(SELECT ...
- AOKO奥科美2.5英寸外置硬盘盒开箱
上次在坛子里发布了一个帖子,然后根据坛友们的反馈,换购了另一个SATA固态硬盘.另一个是配套的硬盘盒,当时在某宝上搜了一圈,最终购买了这款硬盘盒,主要是因为它的外观,旁边有散热片.这款硬盘盒在某宝上不 ...
- Oracle 19c RAC 自动应用RU补丁简明版
环境:Oracle RAC(GI 19.3 + DB 19.3) 本文应用补丁信息, 19.16 RU: p34130714_190000_Linux-x86-64.zip 本文主要演示使用opatc ...
- Linux--uniq 命令(检查和处理重复行的数据)
文本中的重复行,基本上不是我们所要的,所以就要去除掉.linux下有其他命令可以去除重复行,但是我觉得uniq还是比较方便的一个. 使用uniq的时候要注意以下二点1.对文本操作时,它一般会和sort ...
- NC19857 最后的晚餐(dinner)
题目链接 题目 题目描述 **YZ(已被和谐)的食堂实在是太挤辣!所以Apojacsleam现在想邀请他的一些好友去校外吃一顿饭,并在某酒店包下了一桌饭. 当Apojacsleam和他的同学们 ...
- NC14402 求最大值
题目链接 题目 题目描述 给出一个序列,你的任务是求每次操作之后序列中 (a[j]-a[i])/(j-i)[1<=i<j<=n]的最大值. 操作次数有Q次,每次操作需要将位子p处的数 ...