题目 3216 ⭐团建⭐【DFS】蓝桥杯2024年第十五届省赛
小蓝正在和朋友们团建,有一个游戏项目需要两人合作,两个人分别拿到一棵大小为 n 和 m 的树,树上的每个结点上有一个正整数权值 c 1 , c 2 , ⋅ ⋅ ⋅ , c n c_1, c_2, · · · , c_n c1,c2,⋅⋅⋅,cn, d 1 , d 2 , ⋅ ⋅ ⋅ , d m d_1, d_2, · · · , d_m d1,d2,⋅⋅⋅,dm。两个人需要从各自树的根结点 1 出发走向某个叶结点,从根到这个叶结点的路径上经过的所有结点上的权值构成了一个正整数序列,两人的序列的最长公共前缀即为他们的得分。给出两棵树,请计算两个人最多的得分是多少。
问题分析
输入:
- 两棵树的节点权值数组 c 和 d,分别表示第一棵树和第二棵树的节点权值。
- 树的节点编号从 1 到 n(或 m),根节点是 1。
- 树的结构通过邻接表表示。
目标:
从根节点到叶节点的路径中,找到两棵树路径序列的最长公共前缀(LCP)。
方法:
- 使用深度优先搜索(DFS)遍历两棵树,生成所有从根节点到叶节点的路径。
- 对于每对路径,计算它们的最长公共前缀。
- 找到所有路径对中的最大 LCP。
示例
// 示例输入
vector<int> c = {1, 2, 3, 4, 5, 6}; // 第一棵树的节点权值
vector<int> d = {1, 2, 3, 4, 7, 6}; // 第二棵树的节点权值// 第一棵树的邻接表
vector<vector<int>> tree1 = {{}, // 节点 0(未使用){2, 3}, // 节点 1 的子节点{4, 5}, // 节点 2 的子节点{6}, // 节点 3 的子节点{}, // 节点 4{}, // 节点 5{} // 节点 6
};// 第二棵树的邻接表
vector<vector<int>> tree2 = {{}, // 节点 0(未使用){2, 3}, // 节点 1 的子节点{4, 7}, // 节点 2 的子节点{6}, // 节点 3 的子节点{}, // 节点 4{}, // 节点 5{}, // 节点 6{} // 节点 7
};
解题思路
- DFS 函数:
- 使用递归实现深度优先搜索,生成从根节点到叶节点的所有路径。
- 路径存储在
paths中。
- 最长公共前缀函数:
- 比较两个路径序列的节点权值,找到最长公共前缀的长度。
- 最大得分函数:
- 生成两棵树的所有路径。
- 遍历所有路径对,计算它们的 LCP,并找到最大值。
- 主函数:
- 定义树的邻接表和节点权值数组。
- 调用
maxScore函数计算最大得分。
C++实现
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;// 生成从根节点到叶节点的所有路径
void dfs(int node, vector<int>& path, vector<vector<int>>& paths, const vector<vector<int>>& tree) {path.push_back(node); // 将当前节点加入路径if (tree[node].empty()) { // 如果是叶节点paths.push_back(path); // 将当前路径加入结果} else {for (int child : tree[node]) { // 遍历子节点dfs(child, path, paths, tree);}}path.pop_back(); // 回溯
}// 计算两个序列的最长公共前缀长度
int longestCommonPrefix(const vector<int>& seq1, const vector<int>& seq2, const vector<int>& c, const vector<int>& d) {int len = min(seq1.size(), seq2.size());for (int i = 0; i < len; i++) {if (c[seq1[i] - 1] != d[seq2[i] - 1]) { // 比较权值return i;}}return len;
}// 计算最大得分
int maxScore(const vector<vector<int>>& tree1, const vector<vector<int>>& tree2, const vector<int>& c, const vector<int>& d) {// 生成第一棵树的所有路径vector<vector<int>> paths1;vector<int> path1;dfs(1, path1, paths1, tree1);// 生成第二棵树的所有路径vector<vector<int>> paths2;vector<int> path2;dfs(1, path2, paths2, tree2);// 计算所有路径对的最长公共前缀int maxLCP = 0;for (const auto& p1 : paths1) {for (const auto& p2 : paths2) {int lcp = longestCommonPrefix(p1, p2, c, d);maxLCP = max(maxLCP, lcp);}}return maxLCP;
}
复杂度分析
- 时间复杂度:
- 生成路径: O ( N + M ) O(N+M) O(N+M),其中 N N N 和 M M M 分别是两棵树的节点数。
- 计算 LCP: O ( P 1 × P 2 × L ) O(P _1×P_2 ×L) O(P1×P2×L),其中 P 1 P_1 P1 和 P 2 P_2 P2 是路径数,L 是路径的平均长度。
- 空间复杂度:
- 存储路径: O ( P 1 × L + P 2 × L ) O(P_1 ×L+P_2 ×L) O(P1×L+P2×L)。
总结
- 通过 DFS 遍历生成路径,结合 LCP 计算,可以高效地解决这个问题。
- 代码实现清晰,逻辑简单,适用于树结构的问题。
- 该方法的复杂度在合理范围内,能够处理中等规模的输入。
相关文章:
题目 3216 ⭐团建⭐【DFS】蓝桥杯2024年第十五届省赛
小蓝正在和朋友们团建,有一个游戏项目需要两人合作,两个人分别拿到一棵大小为 n 和 m 的树,树上的每个结点上有一个正整数权值 c 1 , c 2 , ⋅ ⋅ ⋅ , c n c_1, c_2, , c_n c1,c2,⋅⋅⋅,cn, d 1 , d 2 , ⋅ ⋅ ⋅ , d m d_1, d_…...
UltraScale系列FPGA实现SDI转PCIE3.0采集卡,基于UltraScale GTH+XDMA架构,提供工程源码和技术支持
目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目本博已有的 SDI 编解码方案我已有的PCIE方案本博客方案的PCIE2.0版本本博客方案的RIFFA版本 3、详细设计方案设计原理框图SDI 输入设备LMH1219RTWR 均衡器UltraScale …...
Linux系列:如何调试 malloc 的底层源码
一:背景 1. 讲故事 上一篇我们聊过 C# 调用 C 的 malloc 代码来演示heap的内存泄露问题,但要想深入研究得必须把 malloc 的实现库 libc.so 给调试起来,大家都知道在Linux 上 libc 和 Windows 的 Win32 API 是一个层级的,由于 Li…...
深入 PipeWire
简介 随着它的成熟,PipeWire 项目正在慢慢地变得流行。它的文档依然相对稀少,但正在逐渐增长。然而,让项目外部的人尝试用他们自己的语言来理解和解释它总是一个好主意,重申想法,从他们自己的角度来看待它。 在之前的…...
20250304笔记-阅读论文
文章目录 前言一、寻找论文1.1寻找有代码的论文方法一:浏览器扩展1.1.1使用流程 方法二:使用Papers with Code 1.2大量搜索代码 二、阅读论文所用软件 三、引用文献格式总结 前言 一、寻找论文 1.1寻找有代码的论文 方法一:浏览器扩展 浏览…...
线程POSIX信号量/基于环形队列的⽣产消费模型
一,POSIX线程信号量 信号量的本质就是一个计数器,也是对资源的预定机制,POSIX信号量和SystemV信号量作⽤相同,都是⽤于同步操作,达到⽆冲突的访问共享资源⽬的。但 POSIX可以⽤于线程间同步。 1,初始化信…...
Spark核心之02:常用算子详解
1、RDD操作详解 # 启动spark-shell spark-shell --master local[2] 1.1 基本转换 1) map map是对RDD中的每个元素都执行一个指定的函数来产生一个新的RDD。 任何原RDD中的元素在新RDD中都有且只有一个元素与之对应。 举例: scala> val a sc.parallelize(1 …...
分布式锁—3.Redisson的公平锁二
大纲 1.Redisson公平锁RedissonFairLock概述 2.公平锁源码之加锁和排队 3.公平锁源码之可重入加锁 4.公平锁源码之新旧版本对比 5.公平锁源码之队列重排 6.公平锁源码之释放锁 7.公平锁源码之按顺序依次加锁 4.公平锁源码之新旧版本对比 (1)新版本再次加锁失败不会刷新…...
C# 类库打包dll文件
目录 前言操作流程注意事项 前言 在C#中,有多种方式可以对代码进行加密,以保护源代码不被轻易查看或修改,这篇文章主要介绍将C# cs类文件加密为dll文件的方式进行保护。 操作流程 在 Visual Studio 中,选择“创建新项目”。 选…...
DELL EMC Unity存储如何让控制器进入service mode和退出service mode
近期遇到好几个关于DELL EMC unity (VNXe)存储系统挂掉的案例,都是很后期才寻找支持到我们这里,然后再看问题,已经变得很复杂,几乎都是从一个相对简单的问题搞成了一锅粥甚至最后丢数据的情况。 为此&…...
【微知】如何通过mlxlink查看Mellanox网卡和光模块相关的信息?( mlxlink -d 01:00.0 -m)
背景 通过mlxlink可以查看Mellanox网卡的一些链路信息和硬件信息,也可以查看所插入的光模块的一些信息。 兄弟篇通过ethtool查看的方法:如何查看Mellanox网卡上的光模块的信息? 命令 mlxlink -d 01:00.0 -mman手册介绍: 如果…...
FPGA开发,使用Deepseek V3还是R1(1):应用场景
以下都是Deepseek生成的答案 FPGA开发,使用Deepseek V3还是R1(1):应用场景 FPGA开发,使用Deepseek V3还是R1(2):V3和R1的区别 FPGA开发,使用Deepseek V3还是R1&#x…...
Linux系列:如何用 C#调用 C方法造成内存泄露
一个简单的非托管内存泄露 1. 构建 so 文件 在 Windows 平台上我们会通过 MSVC 编译器将 C代码编译出一个成品 .dll,在 Linux 上通常会借助 gcc 将 c 编译成 .so 文件,这个.so 全称 Shared Object,为了方便讲解,先上一段简单的代码…...
C# 数据类型相关
分类 按照数据复杂程度 按照数据存储 类型转换 隐式转换 隐式转换无法完成由精度高的数据类型向精度低的数据类型转换 显式转换 又称为强制类型转换,显示转换不一定总是成功,且转换过程中可能出现数据丢失 int num 666;float result (float)num; …...
Python Web应用开发之Flask框架——基础
一、前言 在即将开启的 Flask 学习之旅中,为了能够顺利掌握并运用 Flask 进行 Web 开发,您需要具备一定的基础知识,同时了解相应的运行环境。 需要你具备的知识:Python 编程语言、HTML、CSS、HTTP协议、数据库(如:MySQL、MongoDB) 本文所使用的环境:操作系统Windows…...
分析白屏winscope
在 Android 设备上,播放视频时锁屏后解锁出现闪白屏的问题,通常与 Surface 生命周期、视频渲染或 UI 刷新机制有关。要定位和解决这个问题,可以按照以下步骤进行分析,并利用 WinScop 工具(如果适用)来辅助调…...
使用Word时无法粘贴,弹出错误提示:运行时错误‘53‘:文件未找到:MathPage.WLL
报错说明 使用Word时无法粘贴,粘贴时弹出提示如下: 一般出现这种情况时,我想你是刚装完MathType不久,博主装的是MathType7版本,出现了这个问题。 出现这个问题的原因是"mathpage.wll"这个文件在Office的插…...
玩转python: 深度解析Python高阶函数及推导式
1 高阶函数:工程化编程的基石 1.1 高阶函数基础概念 高阶函数(Higher-Order Function)是函数式编程范式的核心要素,指能够接受函数作为参数或返回函数作为结果的函数。在Python中,这类函数构成了数据处理的基础架构&…...
DeepSeek vs Grok vs ChatGPT:大模型三强争霸,谁将引领AI未来?
DeepSeek vs. Grok vs. ChatGPT:大模型三强争霸,谁将引领AI未来? 在人工智能领域,生成式模型的竞争已进入白热化阶段。DeepSeek、Grok和ChatGPT作为三大代表性工具,凭借独特的技术路径和应用优势,正在重塑…...
VSCode详细安装步骤,适用于 Windows/macOS/Linux 系统
以下是 Visual Studio Code (VSCode) 的详细安装步骤,适用于 Windows/macOS/Linux 系统: VSCode 的详细安装步骤 一、Windows 系统安装1. 下载安装包2. 运行安装程序3. 验证安装 二、macOS 系统安装1. 方法一:官网下载安装包2. 方法二&#x…...
Linux第五讲----gcc与g++,makefile/make
1.代码编译 1.1预处理 我们通过vim编辑完文件之后,想看一下运行结果这时我们便可以试用gcc编译C语言,g编译c. 编译代码: 上述两种方法均可,code.c是我的c语言文件,mycode是我给编译后产生的二进制文件起的名&#x…...
ubuntu22.04下Meshlab打开obj文件闪退——使用Appimage并放入收藏夹中
文章目录 ubuntu22.04下Meshlab打开obj文件闪退,查了下是meshlab的apt没做好。 官网下载:https://www.meshlab.net/#download 赋予权限 sudo chmod a+x MeshLab2023.12-linux.AppImage 双击运行即可 打开权限——下面操作是放在桌面上的 创建桌面快捷方式 # 在 ~/desktop (…...
MAVEN的环境配置
在下载好maven后或解压maven安装包后进行环境配置 1.在用户环境变量中 新建一个MAVEN_HOME 地址为MAVEN目录 注:地址为解压后maven文件的根目录!!! 2.在系统环境变量的path中添加该变量 %MAVEN_HOME%\bin 3. 测试maven安装是否成…...
强化学习无痛上手笔记第1课
文章目录 Markov Decision ProcessDefinitionRelated Concepts Policy for MDP AgentDefinitionJudgement for PolicyValue FunctionsTD formula for value functionsRelation of V and QPolicy CriterionPolicy Improvement TheoremOptimal PolicyReinforcement Learning Fund…...
智能设备上的 AI 移植与部署:新趋势与实践案例
1. 引言:智能设备如何运行 AI? 随着人工智能(AI)技术的快速发展,AI 计算已经从云端走向边缘,嵌入到智能设备中,如智能手机、智能摄像头、机器人、自动驾驶汽车等。这种本地化 AI 计算能够减少延…...
【USRP】NVIDIA Sionna:用于 6G 物理层研究的开源库
目录 Sionna:用于 6G 物理层研究的开源库主要特点实现6G研究的民主化支持 5G、6G 等模块化、可扩展、可伸缩快速启动您的研究 好处原生人工智能支持综合研究平台开放生态系统 安装笔记使用 pip 安装基于Docker的安装从源代码安装“你好世界!”探索锡奥纳…...
LLM大型语言模型(一)
1. 什么是 LLM? LLM(大型语言模型)是一种神经网络,专门用于理解、生成并对人类文本作出响应。这些模型是深度神经网络,通常训练于海量文本数据上,有时甚至覆盖了整个互联网的公开文本。 LLM 中的 “大” …...
BUU44 [BJDCTF2020]ZJCTF,不过如此1 [php://filter][正则表达式get输入数据][捕获组反向引用][php中单双引号]
题目: 我仿佛见到了一位故人。。。也难怪,题目就是ZJCTF 按要求提交/?textdata://,I have a dream&filenext.php后: ......不太行,好像得用filephp://filter/convert.base64-encode/resourcenext.php 耶?那 f…...
软考中级-数据库-3.3 数据结构-树
定义:树是n(n>=0)个结点的有限集合。当n=0时称为空树。在任一非空树中,有且仅有一个称为根的结点:其余结点可分为m(m>=0)个互不相交的有限集T1,T2,T3...,Tm…,其中每个集合又都是一棵树,并且称为根结点的子树。 树的相关概念 1、双亲、孩子和兄弟: 2、结点的度:一个结…...
磁盘空间不足|如何安全清理以释放磁盘空间(开源+节流)
背景: 最近往数据库里存的东西有点多,磁盘不够用 查看磁盘使用情况 df -h /dev/sda5(根目录 /) 已使用 92% 咱们来开源节流 目录 背景: 一、开源 二、节流 1.查找 大于 500MB 的文件: 1. Snap 缓存…...
