【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💐点点关注,收藏不迷路💐

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

读《认知觉醒》:浅谈费曼技巧

最近在阅读《认知觉醒》这本书&#xff0c;封面如下&#xff1a; 读到了里面对于费曼技巧的介绍&#xff08;在第八章&#xff09;&#xff0c;感觉受到了一些启发&#xff0c;在这里分享给大家。 其实之前很早就接触过了费曼技巧&#xff0c;但是并没有很好的应用起来&#x…

零代码快速开发智能体 |甘肃旅游通

零代码快速开发智能体 &#xff5c;甘肃旅游通 本文仅用于文心智能体的活动征文 参与人&#xff1a;mengbei_admin 文心智能体平台是人工智能领域的佼佼者。它拥有强大的语言理解与生成能力&#xff0c;能精准回应各种问题&#xff0c;出色完成文本创作、知识问答和翻译等任…

线性表之双向链表

链表花里胡哨&#xff0c;一应俱全 前言 在这之前&#xff0c;我们已经学习了单链表。我们发现这些链表都是一个接一个朝一个方向接下去&#xff0c;有时&#xff0c;我们想要查找某个结点的时候还得从头开始遍历查找&#xff0c;尽管我们已经学习了顺序表&#xff0c;查找某个…

免费PDF页面提取小工具

下载地址 https://download.csdn.net/download/woshichenpi/89922797 使用说明&#xff1a;PDF页面提取工具 1. 启动应用程序 双击程序的启动图标或者通过命令行运行程序。 2. 选择PDF文件 在应用程序窗口中找到“选择PDF”按钮并点击它。在弹出的文件选择对话框中&#x…

Windows server 2003服务器的安装

Windows server 2003服务器的安装 安装前的准备&#xff1a; 1.镜像SN序列号 图1-1 Windows server 2003的安装包非常人性化 2.指定一个安装位置 图1-2 选择好安装位置 3.启动虚拟机打开安装向导 图1-3 打开VMware17安装向导 图1-4 给虚拟光驱插入光盘镜像 图1-5 输入SN并…

Linux系统安装Redis详细操作步骤(二进制发布包安装方式)

安装方式介绍 在Linux系统中&#xff0c;安装软件的方式主要有四种&#xff0c;这四种安装方式的特点如下&#xff1a; 安装方式特点二进制发布包安装软件已经针对具体平台编译打包发布&#xff0c;只要解压&#xff0c;修改配置即可rpm安装软件已经按照redhat的包管理规范进…

Redis 集群 总结

前言 相关系列 《Redis & 目录》&#xff08;持续更新&#xff09;《Redis & 集群 & 源码》&#xff08;学习过程/多有漏误/仅作参考/不再更新&#xff09;《Redis & 集群 & 总结》&#xff08;学习总结/最新最准/持续更新&#xff09;《Redis & 集群…

计算机网络:网络层 —— IPv4 地址与 MAC 地址 | ARP 协议

文章目录 IPv4地址与MAC地址的封装位置IPv4地址与MAC地址的关系地址解析协议ARP工作原理ARP高速缓存表 IPv4地址与MAC地址的封装位置 在数据传输过程中&#xff0c;每一层都会添加自己的头部信息&#xff0c;最终形成完整的数据包。具体来说&#xff1a; 应用层生成的应用程序…

Java--反射机制

前言&#xff1a; 反射与之前的知识的区别 1.面向对象中创建对象&#xff0c;调用指定结构(属性、方法)等功能&#xff0c;可以不使用反射&#xff0c;也可以使用反射。请问有什么区别? 不使用反射&#xff0c;我们需要考虑封装性。比如:出了自定义类之后&#xff0c;就不能…

WPF+MVVM案例实战(六)- 自定义分页控件实现

文章目录 1、项目准备2、功能实现1、分页控件 DataPager 实现2、分页控件数据模型与查询行为3、数据界面实现 3、运行效果4、源代码获取 1、项目准备 打开项目 Wpf_Examples&#xff0c;新建 PageBarWindow.xaml 界面、PageBarViewModel.cs ,在用户控件库 UserControlLib中创建…

电池的主被动均衡

只有串联的电池需要进行电压均衡&#xff0c;并联的电池由于电压一致&#xff0c;所以并不需要进行均衡&#xff1a; 被动均衡有一个很明显的特征就是会看到很多大电阻&#xff0c;串联在MOS和电池之间&#xff1a;下图中的保护板就是被动均衡板子以及它的原理图&#xff1a; …

软硬件开发面试问题大汇总篇——针对非常规八股问题的提问与应答

软硬件开发&#xff0c;从微控制器编程到复杂的嵌入式系统开发&#xff0c;离不开下位机、操作系统、上位机等&#xff0c;涵盖范围很广。 如何快速一行代码操作硬件寄存器 直接操作硬件寄存器的代码通常依赖于特定平台和编程语言。在 C 或 C 中&#xff0c;常见的方法是使用指…

WORFBENCH:一个创新的评估基准,目的是全面测试大型语言模型在生成复杂工作流 方面的性能。

2024-10-10,由浙江大学和阿里巴巴集团联合创建的WORFBENCH&#xff0c;一个用于评估大型语言模型&#xff08;LLMs&#xff09;生成工作流能力的基准测试。它包含了一系列的测试和评估协议&#xff0c;用于量化和分析LLMs在处理复杂任务时分解问题和规划执行步骤的能力。WORFBE…

智慧停车场导航系统架构及反向寻车系统解决方案

一、系统概述&#xff1a; 随着当前室内定位导航技术在大型公共场所如政务中心、商业综合体、车站中的应用越来越多&#xff0c;人们对智慧停车场的需求也日益凸显出来&#xff0c;并且智慧停车场对大型公共场所智慧化的整体建设起到重要作用。如何更有效提高停车效率&#xf…

如何加密电脑磁盘?电脑本地磁盘加密方法介绍

随着信息技术的不断发展&#xff0c;电脑磁盘加密已经成为保护个人隐私和数据安全的重要手段。本文将介绍几种常见的电脑本地磁盘加密方法&#xff0c;帮助用户保护自己的数据安全。 文件夹只读加密专家 文件夹只读加密专家不仅可以加密电脑中的文件夹&#xff0c;还可以加密保…

Android 13 SystemUI 隐藏下拉快捷面板部分模块(wifi,bt,nfc等)入口

frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java createTileInternal(tileSpec)方法注释想隐藏的模块即可。

【C++进阶篇】——STL的简介

【C进阶篇】——STL的简介 1.什么是STL STL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且是一个包罗数据结构与算法的软件框架。 2.STL的版本 原始版本 Alexander Stepanov、Meng Lee 在…

redis集群配置

一、Redis集群的三种方式 Redis集群提供了三种分布式方案&#xff1a;主从模式&#xff1a;一个主节点和一个或多个从节点&#xff0c;主节点负责写操作&#xff0c;从节点负责读操作&#xff0c;实现读写分离&#xff0c;分担主节点的压力。哨兵模式&#xff1a;哨兵系统用于监…

【每日一题】LeetCode - 盛最多水的容器

给定一个长度为 n 的整数数组 height。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i])。要求找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 输入示例&#xff1a; height [1,8,6,2,5,4,8,3,7]输出&#xff1a; 4…

Python依赖库的几种离线安装方法

Python依赖库的几种安装方法 python经常需要安装一些依赖库&#xff0c;但是有时候环境可以连通python源&#xff0c;有时不能连通需要离线安装&#xff08;安装单个库包或者整个库环境&#xff09;&#xff0c;使用pip的如下方法可以相对简单解决问题。 一、如何copy一个pyt…