【NOIP提高组】加分二叉树
【NOIP提高组】加分二叉树
| 💐The Begin💐点点关注,收藏不迷路💐 |

设一个n个节点的二叉树tree的中序遍历为(l,2,3,…,n),其中数字1,2,3,…,n为节点编号。每个节点都有一个分数(均为正整数),记第j个节点的分数为di,tree及它的每个子树都有一个加分,任一棵子树subtree(也包含tree本身)的加分计算方法如下:
subtree的左子树的加分× subtree的右子树的加分+subtree的根的分数
若某个子树为主,规定其加分为1,叶子的加分就是叶节点本身的分数。不考虑它的空
子树。
试求一棵符合中序遍历为(1,2,3,…,n)且加分最高的二叉树tree。要求输出;
(1)tree的最高加分
(2)tree的前序遍历
输入
第1行:一个整数n(n<30),为节点个数。
第2行:n个用空格隔开的整数,为每个节点的分数(分数<100)。
输出
第1行:一个整数,为最高加分(结果不会超过4,000,000,000)。
第2行:n个用空格隔开的整数,为该树的前序遍历。
样例输入
5
5 7 1 2 10
样例输出
145
3 1 2 4 5
以下是用 C 语言实现的代码:
#include <stdio.h>#define MAX_NODE 60// 定义最大节点数
int score[MAX_NODE][MAX_NODE]; // score 存储子树的最大加分
int midNode[MAX_NODE][MAX_NODE]; // midNode 存储子树最大加分时的根节点位置
int nodeVal[MAX_NODE]; // nodeVal 存储节点的分数
int numNodes; // numNodes 代表节点总数// 递归计算最大加分函数
int findMaxScore(int start, int end) {// 如果区间无效,返回 1if (start > end)return 1;// 如果已经计算过该区间的最大加分,直接返回结果if (score[start][end])return score[start][end];// 如果区间只有一个节点,最大加分就是该节点的分数if (start == end) {score[start][end] = nodeVal[start];} else {int tempScore;for (int i = start; i <= end; ++i) {// 递归计算左右子树的最大加分并加上当前节点的分数tempScore = findMaxScore(start, i - 1) * findMaxScore(i + 1, end) + nodeVal[i];// 更新最大加分和对应的中间节点if (tempScore > score[start][end]) {score[start][end] = tempScore;midNode[start][end] = i;}}}return score[start][end];
}// 输出前序遍历函数
void printPreorder(int start, int end) {// 如果区间无效,直接返回if (start > end)return;// 如果区间只有一个节点,直接输出该节点if (start == end) {printf("%d ", start);} else {// 输出中间节点printf("%d ", midNode[start][end]);// 递归输出左子树和右子树printPreorder(start, midNode[start][end] - 1);printPreorder(midNode[start][end] + 1, end);}
}int main() {scanf("%d", &numNodes);for (int i = 1; i <= numNodes; ++i) {scanf("%d", &nodeVal[i]);}printf("%d\n", findMaxScore(1, numNodes));printPreorder(1, numNodes);return 0;
}
以下是用 C++实现的代码:
#include <iostream>const int MAX_N = 60;// 定义最大节点数
int score[MAX_N][MAX_N]; // score 存储子树的最大加分
int midNode[MAX_N][MAX_N]; // midNode 存储子树最大加分时的根节点位置
int nodeVal[MAX_N]; // nodeVal 存储节点的分数
int numNodes; // numNodes 代表节点总数// 递归计算最大加分函数
int findMaxScore(int start, int end) {// 如果区间无效,返回 1if (start > end)return 1;// 如果已经计算过该区间的最大加分,直接返回结果if (score[start][end])return score[start][end];// 如果区间只有一个节点,最大加分就是该节点的分数if (start == end) {score[start][end] = nodeVal[start];} else {int tempScore;for (int i = start; i <= end; ++i) {// 递归计算左右子树的最大加分并加上当前节点的分数tempScore = findMaxScore(start, i - 1) * findMaxScore(i + 1, end) + nodeVal[i];// 更新最大加分和对应的中间节点if (tempScore > score[start][end]) {score[start][end] = tempScore;midNode[start][end] = i;}}}return score[start][end];
}// 输出前序遍历函数
void printPreorder(int start, int end) {// 如果区间无效,直接返回if (start > end)return;// 如果区间只有一个节点,直接输出该节点if (start == end) {std::cout << start << " ";} else {// 输出中间节点std::cout << midNode[start][end] << " ";// 递归输出左子树和右子树printPreorder(start, midNode[start][end] - 1);printPreorder(midNode[start][end] + 1, end);}
}int main() {std::cin >> numNodes;for (int i = 1; i <= numNodes; ++i) {std::cin >> nodeVal[i];}std::cout << findMaxScore(1, numNodes) << std::endl;printPreorder(1, numNodes);return 0;
}
以下是用 Java 实现的代码:
import java.util.Scanner;class BinaryTreeScoreCalculator {// 定义最大节点数private static final int MAX_N = 60;// 存储子树的最大加分static int[][] score = new int[MAX_N][MAX_N];// 存储子树最大加分时的根节点位置static int[][] midNode = new int[MAX_N][MAX_N];// 存储节点的分数static int[] nodeVal = new int[MAX_N];// 代表节点总数static int numNodes;// 递归计算最大加分函数static int findMaxScore(int start, int end) {// 如果区间无效,返回 1if (start > end)return 1;// 如果已经计算过该区间的最大加分,直接返回结果if (score[start][end]!= 0)return score[start][end];// 如果区间只有一个节点,最大加分就是该节点的分数if (start == end) {score[start][end] = nodeVal[start];} else {int tempScore;for (int i = start; i <= end; ++i) {// 递归计算左右子树的最大加分并加上当前节点的分数tempScore = findMaxScore(start, i - 1) * findMaxScore(i + 1, end) + nodeVal[i];// 更新最大加分和对应的中间节点if (tempScore > score[start][end]) {score[start][end] = tempScore;midNode[start][end] = i;}}}return score[start][end];}// 输出前序遍历函数static void printPreorder(int start, int end) {// 如果区间无效,直接返回if (start > end)return;// 如果区间只有一个节点,直接输出该节点if (start == end) {System.out.print(start + " ");} else {// 输出中间节点System.out.print(midNode[start][end] + " ");// 递归输出左子树和右子树printPreorder(start, midNode[start][end] - 1);printPreorder(midNode[start][end] + 1, end);}}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);numNodes = scanner.nextInt();for (int i = 1; i <= numNodes; ++i) {nodeVal[i] = scanner.nextInt();}System.out.println(findMaxScore(1, numNodes));printPreorder(1, numNodes);}
}

| 💐The End💐点点关注,收藏不迷路💐 |
相关文章:
【NOIP提高组】加分二叉树
【NOIP提高组】加分二叉树 💐The Begin💐点点关注,收藏不迷路💐 设一个n个节点的二叉树tree的中序遍历为(l,2,3,…,n),其中数字1,2,3,…,n为节点编号。每个节点都有一个分数(均为正整…...
HarmonyOS 相对布局(RelativeContainer)
1. HarmonyOS 相对布局(RelativeContainer) 文档中心:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-layout-development-relative-layout-V5 RelativeContainer为采用相对布局的容器,支持容器内部的子元素设…...
webpack5搭建react脚手架详细步骤
1. 初始化项目 首先,创建一个新目录并初始化项目: bash mkdir create-react cd create-react pnpm init --y git init 这里使用pnpm作为包管理工具,因为它在处理依赖和速度上表现更好。 2. 安装React和TypeScript 安装React和React-DOM…...
速盾:高防cdn怎么拦截恶意ip?
高防CDN(Content Delivery Network)是一种用于防御网络攻击和提供高可用性的服务。它通过分发网络流量,将用户的请求导向最近的服务器,从而提高网站的加载速度和稳定性。然而,不可避免地,有些恶意IP地址会试…...
太阳能面板分割系统:训练自动化
太阳能面板分割系统源码&数据集分享 [yolov8-seg-EfficientHead&yolov8-seg-vanillanet等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Globa…...
C++笔记---位图
1. 位图的概念 位图(Bitmap)是一种基于位操作的数据结构,用于表示一组元素的集合信息。它通常是一个仅包含0和1的数组,每个元素对应一个二进制位,若该元素存在,则对应的位为1;若不存在ÿ…...
ABC370
## A - Raise Both Hands (模拟) 题意:输入l,r,如果l1r0输出yes,l0r1输出no,否则输出Invalid 代码: #include<bits/stdc.h> using namespace std; typedef long long ll; vo…...
C语言[求x的y次方]
C语言——求x的y次方 这段 C 代码的目的是从用户输入获取两个整数 x 和 y ,然后计算 x 的 y 次幂(不过这里有个小错误,实际计算的是 x 的 (y - 1) 次幂,后面会详细说),最后输出结果。 代码如下: #include…...
JavaScript part2
一.前言 前面我们讲了一下js的基础语法,但是这些还是远远不够的,我们要想操作标签,实现一个动态且好看的页面,就得学会BOM和DOM,这些都是浏览器和页面的,这样我们才能实现一个好看的页面 二.BOM对象 BOM…...
HarmonyOS开发 - 本地持久化之实现LocalStorage实例
用户首选项为应用提供Key-Value键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。数据存储形式为键值对,键的类型为字符串型,值的存储数据类型包括数字型、字符型、布尔型以及这3种类型的数组类型。 说明&#x…...
【C++打怪之路Lv12】-- 模板进阶
#1024程序员节|征文# 🌈 个人主页:白子寰 🔥 分类专栏:重生之我在学Linux,C打怪之路,python从入门到精通,数据结构,C语言,C语言题集👈 希望得到您…...
第23周Java主流框架入门-SpringMVC 2.RESTful开发风格
课程笔记:RESTful 开发风格 课程介绍 本节课程介绍 RESTful 开发风格,以及如何在 Spring MVC 中应用这种开发模式。传统 MVC 开发通过 Servlet、JSP 和 Java Bean 实现前后端交互,而 RESTful 开发提供了一种新的理念,更适合现代…...
QT枚举类型转字符串和使用QDebug<<重载输出私有枚举类型
一 将QT自带的枚举类型转换为QString 需要的头文件: #include <QMetaObject> #include <QMetaEnum> 测试代码 const QMetaObject *metaObject &QImage::staticMetaObject;QMetaEnum metaEnum metaObject->enumerator(metaObject->indexOf…...
手机柔性屏全贴合视觉应用
在高科技日新月异的今天,手机柔性显示屏作为智能手机市场的新宠,以其独特的可弯曲、轻薄及高耐用性特性引领着行业潮流。然而,在利用贴合机加工这些先进显示屏的过程中,仍面临着诸多技术挑战。其中,高精度对位、应力控…...
《Python游戏编程入门》注-第3章3
《Python游戏编程入门》的“3.2.4 Mad Lib”中介绍了一个名为“Mad Lib”游戏的编写方法。 1 游戏玩法 “Mad Lib”游戏由玩家根据提示输入一些信息,例如男人姓名、女人姓名、喜欢的食物以及太空船的名字等。游戏根据玩家输入的信息编写出一个故事,如图…...
Netty-TCP服务端粘包、拆包问题(两种格式)
前言 最近公司搞了个小业务,需要使用TCP协议,我这边负责服务端。客户端是某个设备,客户端传参格式、包头包尾等都是固定的,不可改变,而且还有个蓝牙传感器,透传数据到这个设备,然后通过这个设备…...
centos安装指定版本的jenkins
打开jenkins镜像包官网,找到自己想要安装的版本,官网地址:https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable 下载指定版本安装包: wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/jenkins-2.452.…...
QT 周期性的杀死一个进程(软件),一分钟后自动退出
1.原因:某软件开机自启动很烦,搞一个程序干掉这个自启动的软件 2.QT代码 main.cpp #include "KillXXX.h" #include <QtWidgets/QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);KillXXX k;return a.exec…...
MySQL任意版本安装卸载和数据库原理图绘制
MYSQL任意版本安装和卸载 安装: 1、解压文件 --- 不能出现中文路径 2、在解压目录(安装目录)下: 1>.创建data文件夹 2>.创建配置文件my.txt 然后修改成ini格式 3、修改配置文件 basedirD:\\mysql\\mysql-5.7.28-winx64…...
技术成神之路:设计模式(二十三)解释器模式
相关文章:技术成神之路:二十三种设计模式(导航页) 介绍 解释器模式(Interpreter Pattern)是一种行为设计模式,用于定义一种语言的文法表示,并提供一个解释器来处理这种文法。它用于处理具有特定语法或表达…...
Steam Depot清单自动化工具:Onekey实现游戏数据高效管理的完整方案
Steam Depot清单自动化工具:Onekey实现游戏数据高效管理的完整方案 【免费下载链接】Onekey Onekey Steam Depot Manifest Downloader 项目地址: https://gitcode.com/gh_mirrors/one/Onekey 在游戏开发与玩家社区中,获取和管理Steam游戏清单一直…...
AI率超80%不要慌,这样处理比自己改快10倍
看到AI率80%,第一反应是慌乱,这完全正常。但慌乱之后,做什么决定很关键。 这篇文章只说一件事:为什么用工具处理比自己改快10倍,怎么用工具最快解决这个问题。 手动改写的真实速度 先来做一个计算。 一个写作速度正…...
COMSOL模拟:电磁超声压电接收技术在铝板裂纹检测中的应用
comsol电磁超声压电接收EMAT 在1mm厚铝板中激励250kHz的电磁超声在200mm位置处设置一个深0.8mm的裂纹缺陷,左端面设为低反射边界 在85mm位置处放置一个压电片接收信号,信号如图3所示,三个波分别为始波,裂纹反射波(S0模态)和右端面…...
三步掌握Strawberry Perl:Windows Perl开发环境配置指南
三步掌握Strawberry Perl:Windows Perl开发环境配置指南 【免费下载链接】Perl-Dist-Strawberry Tooling to build and package releases for Perl on Windows. 项目地址: https://gitcode.com/gh_mirrors/pe/Perl-Dist-Strawberry 在Windows系统上进行Perl开…...
直流电机双闭环调速控制系统仿真模型 转速电流双闭环PI控制 Matlab/Simulink仿真模型 带报告
直流电机双闭环调速控制系统仿真模型 转速电流双闭环PI控制 Matlab/Simulink仿真模型 带报告在 Simulink 里搭建直流电机双闭环调速系统,而是通过连接模块来实现。这段代码会自动计算 PI 控制器的参数,DC_Motor_Dual_Loop 的仿真模型。 🛠️ …...
2025华中杯B题:校园共享单车调度与维护实战解析——从数据清洗到最优路径的完整建模指南
1. 校园共享单车数据清洗实战指南 第一次拿到共享单车数据时,我差点被那些"200"和空白单元格整崩溃了。这份数据就像被熊孩子玩过的拼图,需要我们一块块修复完整。数据清洗是建模的第一步,也是最容易被忽视的关键环节。 1.1 异常…...
【西瓜带你学设计模式 | 第十二期 - 装饰器模式】装饰器模式 —— 动态叠加功能实现、优缺点与适用场景
文章目录前言1. 装饰器模式是什么?2. 装饰器模式解决什么问题?3. 实现步骤4. 静态结构4.1 抽象组件:Coffee(统一接口)4.2 具体组件:SimpleCoffee(基础咖啡)4.3 装饰器抽象类…...
SpringMVC+MyBatis整合微信H5支付全流程实战(附避坑指南)
SpringMVCMyBatis整合微信H5支付全流程实战(附避坑指南) 移动支付已成为现代商业的基础设施,而微信H5支付作为连接移动网页与支付系统的重要桥梁,其技术实现却常让开发者陷入各种"坑"。本文将带你从零开始,…...
2026届毕业生推荐的十大降AI率网站横评
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 达成降低AIGC率这一目标,也就是要削减文本里那种能够被辨认作是人工智能生成内容…...
企业级应用权限架构设计与实践指南
企业级应用权限架构设计与实践指南 【免费下载链接】react Reactwebpackreduxant designaxiosless全家桶后台管理框架 项目地址: https://gitcode.com/gh_mirrors/reac/react 一、概念解析:权限管理的核心要素 🔍 权限管理是企业级应用的安全基…...
