首页/新闻资讯/正文详情

P1040 加分二叉树【洛谷算法习题】

发布时间:2026/9/26 11:13:15 来源:云帆数科 栏目:资讯中心
P1040 加分二叉树【洛谷算法习题】
P1040 加分二叉树网页链接P1040 加分二叉树题目描述设一个n nn个节点的二叉树tree \text{tree}tree的中序遍历为( 1 , 2 , 3 , … , n ) (1,2,3,\ldots,n)(1,2,3,…,n)其中数字1 , 2 , 3 , … , n 1,2,3,\ldots,n1,2,3,…,n为节点编号。每个节点都有一个分数均为正整数记第i ii个节点的分数为d i d_idi​tree \text{tree}tree及它的每个子树都有一个加分任一棵子树subtree \text{subtree}subtree也包含tree \text{tree}tree本身的加分计算方法如下subtree \text{subtree}subtree的左子树的加分× \times×subtree \text{subtree}subtree的右子树的加分 subtree \text{subtree}subtree的根的分数。若某个子树为空规定其加分为1 11叶子的加分就是叶节点本身的分数。不考虑它的空子树。试求一棵符合中序遍历为( 1 , 2 , 3 , … , n ) (1,2,3,\ldots,n)(1,2,3,…,n)且加分最高的二叉树tree \text{tree}tree。要求输出tree \text{tree}tree的最高加分。tree \text{tree}tree的前序遍历。输入格式第1 11行1 11个整数n nn为节点个数。第2 22行n nn个用空格隔开的整数为每个节点的分数。输出格式第1 11行1 11个整数为最高加分$ Ans \le 4,000,000,000$。第2 22行n nn个用空格隔开的整数为该树的前序遍历。如果你输出的前序遍历不合法可能会出现 UKE 的评测记录。输入输出样例 #1输入 #15 5 7 1 2 10输出 #1145 3 1 2 4 5说明/提示数据规模与约定对于全部的测试点保证1 ≤ n 30 1 \leq n 301≤n30节点的分数是小于100 100100的正整数答案不超过4 × 10 9 4 \times 10^94×109。解题思路本题是区间动态规划 二叉树遍历的经典问题。给定一棵二叉树的中序遍历为1 , 2 , … , n 1,2,\dots,n1,2,…,n每个节点有一个分数定义子树的加分为“左子树加分 × 右子树加分 根节点分数”空子树加分为1 11。要求找出加分最高的二叉树并输出最高加分及其前序遍历。由于中序遍历固定任意子树必然对应一个连续区间因此可以用区间 DP 求解。1. 问题等价转化中序遍历为1 ∼ n 1\sim n1∼n所以任何一棵子树都对应原序列的一个连续子区间[ i , j ] [i, j][i,j]。设f [ i ] [ j ] f[i][j]f[i][j]表示由区间[ i , j ] [i, j][i,j]构成的子树能获得的最大加分。设r t [ i ] [ j ] rt[i][j]rt[i][j]表示该最大加分对应的根节点编号用于最后输出前序遍历。边界条件空子树加分为1 11即f [ i ] [ i − 1 ] 1 f[i][i-1] 1f[i][i−1]1当i j i jij时。叶节点加分即自身分数f [ i ] [ i ] d i f[i][i] d_if[i][i]di​且r t [ i ] [ i ] i rt[i][i] irt[i][i]i。状态转移对于区间[ i , j ] [i, j][i,j]枚举根节点k ∈ [ i , j ] k \in [i, j]k∈[i,j]则左子树为[ i , k − 1 ] [i, k-1][i,k−1]右子树为[ k 1 , j ] [k1, j][k1,j]加分计算为f [ i ] [ j ] max ⁡ k i j ( f [ i ] [ k − 1 ] × f [ k 1 ] [ j ] d k ) f[i][j] \max_{ki}^{j} \big( f[i][k-1] \times f[k1][j] d_k \big)f[i][j]kimaxj​(f[i][k−1]×f[k1][j]dk​)同时记录取得最大值的k kk作为根节点r t [ i ] [ j ] k rt[i][j] krt[i][j]k。2. 算法实现初始化读入n nn和每个节点的分数d i d_idi​。对于所有i ii令f [ i ] [ i ] d i f[i][i] d_if[i][i]di​f [ i ] [ i − 1 ] 1 f[i][i-1] 1f[i][i−1]1r t [ i ] [ i ] i rt[i][i] irt[i][i]i。区间 DP按区间长度len从1 11到n − 1 n-1n−1枚举len表示区间长度减1 11即j i l e n j i lenjilen。对于每个左端点i ii计算右端点j i l e n j i lenjilen。初始令根为i iif [ i ] [ j ] f [ i 1 ] [ j ] f [ i ] [ i ] f[i][j] f[i1][j] f[i][i]f[i][j]f[i1][j]f[i][i]即左子树为空的情况r t [ i ] [ j ] i rt[i][j] irt[i][j]i。然后枚举根k kk从i 1 i1i1到j − 1 j-1j−1计算f [ i ] [ k − 1 ] × f [ k 1 ] [ j ] f [ k ] [ k ] f[i][k-1] \times f[k1][j] f[k][k]f[i][k−1]×f[k1][j]f[k][k]若大于当前f [ i ] [ j ] f[i][j]f[i][j]则更新f [ i ] [ j ] f[i][j]f[i][j]和r t [ i ] [ j ] rt[i][j]rt[i][j]。输出结果最高加分为f [ 1 ] [ n ] f[1][n]f[1][n]。前序遍历从根节点开始递归输出根、左子树、右子树。定义函数print(l, r)若l r l rlr返回。输出r t [ l ] [ r ] rt[l][r]rt[l][r]。递归print(l, rt[l][r] - 1)和print(rt[l][r] 1, r)。3. 复杂度分析时间复杂度状态数为O ( n 2 ) O(n^2)O(n2)每个状态枚举根节点O ( n ) O(n)O(n)总时间复杂度O ( n 3 ) O(n^3)O(n3)。n 30 n 30n30运算量极小完全可行。空间复杂度需要f ff和r t rtrt两个二维数组大小O ( n 2 ) O(n^2)O(n2)空间消耗很小。总结利用中序遍历固定为连续区间的性质将二叉树构造问题转化为区间 DP。通过枚举根节点划分左右子树递推计算最大加分并记录每个区间的根节点以便还原前序遍历。算法思路清晰实现简单适合小规模数据。代码简要说明全局数组f[50][50]存储区间最大加分rt[50][50]存储区间对应的根节点。初始化读入分数设置叶节点和空子树的加分初始化根节点。区间 DP外层循环区间长度内层循环左端点枚举根节点更新最大值和根位置。递归输出前序print(l, r)函数按照“根-左-右”的顺序输出节点编号。主函数读入数据调用 DP输出最高加分和前序遍历。代码内容#includebits/stdc.husingnamespacestd;#defineendl\ntypedeflonglongll;typedefunsignedlonglongull;typedefvectorvectorllvvt;typedefpairll,llpll;constll N1e310;constll INF1e18;constll M1e610;constll mod1e97;constll SZ50;ll n;ll f[SZ][SZ],rt[SZ][SZ];voidprint(ll l,ll r){if(lr)return;printf(%lld ,rt[l][r]);if(lr)return;print(l,rt[l][r]-1);print(rt[l][r]1,r);}intmain(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);scanf(%lld,n);for(ll i1;in;i){scanf(%lld,f[i][i]);f[i][i-1]1;rt[i][i]i;}for(ll len1;lenn;len){for(ll i1;ilenn;i){ll jilen;f[i][j]f[i1][j]f[i][i];rt[i][j]i;for(ll ki1;kj;k){if(f[i][j]f[i][k-1]*f[k1][j]f[k][k]){f[i][j]f[i][k-1]*f[k1][j]f[k][k];rt[i][j]k;}}}}coutf[1][n]endl;print(1,n);return0;}

相关推荐

《深度学习》期末练习题 | 判断题第4篇(逐题精讲)
《深度学习》期末练习题 | 判断题第4篇(逐题精讲)

《深度学习》期末练习题 | 判断题第4篇(逐题精讲) 前言:本篇为《深度学习》期末练习题判断题系列的第4篇,涵盖题号 49~56,涉及自注意力机制、Transformer、YOLOv5 目标检测、COCO/VOC 数据集等核心知识点。每道题均附详… · 2026/9/26 11:13:15

DeskcommCRM实战:从选型部署到团队落地的客户管理自动化指南
DeskcommCRM实战:从选型部署到团队落地的客户管理自动化指南

第一次看到DeskcommCRM这个项目名的时候,我脑子里弹出来的画面,是一个整天坐在工位上给客户回消息、记跟进、查订单的商务专员。DeskcommCRM拆开来看,Desk代表桌面/工位,Comm是Communication,合在一起就是在桌面上完成… · 2026/9/26 11:13:15

最短路径--Bellman-Ford算法详解
最短路径--Bellman-Ford算法详解

🔥keyipatience:个人主页 🎬作者简介:C/C后端开发学习者 🌟专栏传送门:《c》《linux》《c高阶数据结构》《c数据结构与算法》 ⭐️patience is key in life Bellman-Ford算法 Dijkstra:仅支持正权图单源最… · 2026/9/26 11:13:15

OpenClaw 飞书 CLI 实战:用 TaoToken 统一 Key 打通 AI 消息流
OpenClaw 飞书 CLI 实战:用 TaoToken 统一 Key 打通 AI 消息流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 11:46:48

问卷星自动填写脚本原理与实战:DOM操作+事件模拟+Tampermonkey封装
问卷星自动填写脚本原理与实战:DOM操作+事件模拟+Tampermonkey封装

简介:这是一份面向前端开发者与自动化测试初学者的浏览器端轻量级工具脚本,用于辅助问卷星平台表单的快速随机填写,解决人工重复填答效率低、样本采集耗时等问题。资源包共5个文件,含核心功能脚本(.js)、3个… · 2026/9/26 11:46:48

Notepad++主题配置全指南:语法高亮、JSON/Python适配与XML定制
Notepad++主题配置全指南:语法高亮、JSON/Python适配与XML定制

简介:本资源是一套专为Notepad用户定制的29款高质量主题集合,适用于前端开发、代码编辑及日常文本处理场景,尤其适合追求个性化编辑界面与提升编码舒适度的中高级开发者。压缩包内全部为.stylers.xml格式的主题配置文件,共29个&am… · 2026/9/26 11:46:48

DOS命令实用指南:从文件操作到批量处理与虚拟机粘贴
DOS命令实用指南:从文件操作到批量处理与虚拟机粘贴

不少朋友一听到“DOS命令”这四个字,第一反应是“上个世纪的东西”,觉得现在有鼠标有图形界面,谁还用这个。但真到了工作上,你会发现命令行还是那根最靠谱的救命稻草——批量改文件名、按日期建目录、跨机器拷贝命令、写个一键备份… · 2026/9/26 11:46:48

廊坊修路虎如何选厂?六大维度与空气悬挂实战解析
廊坊修路虎如何选厂?六大维度与空气悬挂实战解析

路虎这车,在懂行的人眼里是“一半是豪华,一半是电路图”。尤其是在北京和廊坊这一圈,很多车主买它的时候图的是气场和越野能力,用起来之后才慢慢明白,真正的挑战藏在那些时不时冒出来的故障码和底盘异响里。身边越来越… · 2026/9/26 11:46:48

Windows 本地 Hermes 智能体整合包|5 分钟零代码完整部署实操指南(TaoToken 统一 Key 配置版)
Windows 本地 Hermes 智能体整合包|5 分钟零代码完整部署实操指南(TaoToken 统一 Key 配置版)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 11:46:42

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21

OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40

向下兼容与向上兼容:接口设计中的兼容性策略与工程实践
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践

一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码