NOIP2003.加分二叉树

题目链接

题目描述

 设一个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个用空格隔开的整数,为该树的前序遍历。

示例1
输入

5 5 7 1 2 10

输出

145
3 1 2 4 5

思路

按照题意,很容易想到分治做法,构造一个函数 是求区间 的最优解
然后由
s u b t r e e 的左子树的加分 × s u b t r e e 的右子树的加分+ s u b t r e e 的根的分数 subtree的左子树的加分× subtree的右子树的加分+subtree的根的分数 subtree的左子树的加分×subtree的右子树的加分+subtree的根的分数
可以得到
f [ l ] [ r ] = s o l v e ( l , k − 1 ) ∗ s o l v e ( k + 1 , r ) + a [ k ] f[l][r] = solve(l,k-1)*solve(k+1,r) + a[k] f[l][r]=solve(l,k1)solve(k+1,r)+a[k]

其中 k为[l,r]中的一个节点
那么最终答案就是f[1][n]

考虑怎么输出前序遍历的结果呢?我们在记忆化搜索的时候维护一个 root[l][r] = k
代表区间[l,r] 的最优值取的是k节点
那么我们前序遍历的时候只需要遍历 k,[l,k-1],[l,k+1]即可

在递归函数中,如果出现r<l的情况,那我们直接返回1,因为当k=l时候,k节点没有左子节点,但是可能有右子节点,我们要将右子节点加到k的加分中去

代码

N = 32
w = [0] * (N + 1)
f = [[0] * (N + 1) for _ in range(N + 1)]
root = [[0] * (N + 1) for _ in range(N + 1)]def solve(l, r):if f[l][r] != 0:return f[l][r]if l == r:return w[l]if l > r:return 1for i in range(l, r + 1):res = solve(l, i - 1) * solve(i + 1, r) + w[i]if res > f[l][r]:f[l][r] = resroot[l][r] = ireturn f[l][r]def print_tree(l, r):if l == r:print(l, end=" ")returnif l > r:returnprint(root[l][r], end=" ")print_tree(l, root[l][r] - 1)print_tree(root[l][r] + 1, r)n = int(input())
w[1:n+1] = map(int, input().split())print(solve(1, n))
print_tree(1, n)

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

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

相关文章

RBF神经网络中的RBF的英文全称是什么,是用来干什么的?

问题描述&#xff1a;RBF神经网络中的RBF的英文全称是什么&#xff0c;是用来干什么的&#xff1f; 问题解答&#xff1a; RBF神经网络中的RBF是径向基函数&#xff08;Radial Basis Function&#xff09;的缩写。径向基函数是一种在机器学习和模式识别中常用的函数类型&…

数据库从入门到精通(一)数据库基础操作

mysql数据库基础操作 cmd下启动mysql数据库操作命令数据库重要的删除操作数据库增删改查操作插入数据更新数据删除数据查询数据查询指定记录in查询满足指定范围之内的条件记录not in查询不在指定范围之内的条件记录带between and 的范围查询带like的字符匹配查询(d%以d开头,%d以…

猫头虎分享已解决Bug || SyntaxError: Unexpected token o in JSON at position 1 ‍

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

手动下载spacy的en_core_web_sm模型

手动下载 首先&#xff0c;用下面连接下载模型。我下载了 .tar.gz 格式。 然后提取它并通过指定所需子文件夹的路径将其加载到代码中。为了确保路径正确&#xff0c;您应该进入包含 config.cfg 文件的文件夹。 https://github.com/explosion/spacy-models/releases 例子代码…

Python在生物信息学中的应用:同时对数据做转换和换算

我们需要调用一个换算&#xff08;reduction&#xff09;函数&#xff0c;例如 sum()、min()、max()等&#xff0c;但首先得对数据做转换或筛选。 解决方案 一种优雅的方式能将数据换算和转换结合在一起&#xff0c;即在函数中使用生成器表达式。例如&#xff0c;要计算平方和&…

【MATLAB】小波神经网络回归预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 小波神经网络回归预测算法是一种利用小波变换和人工神经网络相结合的方法&#xff0c;用于解决回归预测问题。下面将详细介绍该算法的原理与方法&#xff1a; 小波变换&#xff1a; 小波变…

LeetCode115. Distinct Subsequences——动态规划

文章目录 一、题目二、题解 一、题目 Given two strings s and t, return the number of distinct subsequences of s which equals t. The test cases are generated so that the answer fits on a 32-bit signed integer. Example 1: Input: s “rabbbit”, t “rabbit…

rocketMQ下载、安装及配置

topic主题 - 里边存在多个队列&#xff08;队列是真实存在的&#xff09; rocketMQ安装及配置 一、官网下载 windows和linux系统版本都一样。Binary 下载 下载 | RocketMQ (apache.org) 二、修改运行内存及broker.conf、配置环境变量 1、修改根目录->bin目录下runserve…

如何生成一个修仙世界的狗血短剧剧本2

如何生成一个修仙世界的狗血短剧剧本2 生成一个修仙世界的狗血短剧剧本对话 生成一个修仙世界的狗血短剧剧本 剧本名称&#xff1a;《仙途情缘》 角色&#xff1a; 易天行&#xff1a;男主角&#xff0c;天赋异禀的修仙者&#xff0c;性格坚毅&#xff0c;正直善良。梦瑶&…

ACM训练题:互不侵犯

一看数据范围&#xff0c;如果是枚举所有的棋盘情况&#xff0c;2^K&#xff0c;肯定超了&#xff0c;自然是要一行一行递推&#xff0c;而相邻这个情况用位运算会比较方便&#xff0c;所以用状压dp。 具体算法&#xff1a;dp[i][j][k]表示第i行&#xff0c;前i行有j个棋子&…

P5440 【XR-2】奇迹 (大模拟dfs+欧拉筛板子+闰年)

传送门https://www.luogu.com.cn/problem/P5440 相信奇迹的人&#xff0c;本身就和奇迹一样了不起。——笛亚 《星游记》 思路历程&#xff1a;很离谱的一题&#xff0c;在理论上并不困难&#xff0c;只要简单dfs欧拉筛就能过。在一开始&#xff0c;我采用了倒着模拟的思路&am…

Zig、C、Rust的Pk1

Zig、C、Rust的Pk1 github.com上看到“A basic comparitive analysis of C, C, Rust, and Zig.”&#xff1a;https://github.com/CoalNova/BasicCompare/tree/main 里边的代码是9个月之前的&#xff0c;用现在的zig 0.11.0 及0.12-dev都无法通过编译(具体为&#xff1a;zig-w…

微信,支付宝在线换钱平台系统源码

探索全新、全开源的在线换钱系统源码&#xff0c;它将以前所未有的方式改变您的支付体验。我们为您精心打造了一个集简单易用与安全高效于一身的优质产品&#xff0c;它采用最新的技术开发&#xff0c;为您带来前所未有的便捷与安心。 这款在线换钱系统源码设计直观&#xff0…

AI:127-基于卷积神经网络的交通拥堵预测

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

【操作系统】4.本章疑难点

4.本章疑难点 1.并行性与并发性的区别和联系 并行性和并发性是相似又有区别的两个概念&#xff0c; 并行性具指两个成多个事件在同一时刻发生&#xff0c; 并发性是指两个或多个事件在同一时间间隔内发生。 在多道程序环境下&#xff0c;并发性是指在一段时间内&#xff0c;宏…

Java程序内存溢出的解决方法

前言 最近有个项目线上出现了内存溢出的情况&#xff0c;以前没出现过这种情况&#xff0c;排查后发现原来是启动脚本的问题&#xff0c;堆内存分配的不足。如果在运行Java应用程序时&#xff0c;设置的内存参数不足以满足应用程序的内存需求&#xff0c;可能会导致 OutOfMemo…

error An unexpected error occurred: “https://registry.npm.taobao.org

背景&#xff1a; 想使用yarn命令结果报错 问题原因&#xff1a; 原来证书到期了 http://registry.npm.taobao.org/ 把这个放到浏览器搜索的时候自动换成https://registry.npmmirror.com/ 方案&#xff1a; npm cache clean --forcenpm config set registry https://registry…

政安晨:示例演绎机器学习中(深度学习)神经网络的数学基础——快速理解核心概念(一){两篇文章讲清楚}

进入人工智能领域免不了与算法打交道&#xff0c;算法依托数学基础&#xff0c;很多小伙伴可能新生畏惧&#xff0c;不用怕&#xff0c;算法没那么难&#xff0c;也没那么玄乎&#xff0c;未来人工智能时代说不得人人都要了解算法、应用算法。 本文试图以一篇文章&#xff0c;…

comfyui换脸学习笔记

目录 ComfyUI_Lam 人脸融合方案&#xff1a; 圣诞写真工作流 IPadapter faceID/faceID plus/faceID plusV2/Reactor换脸效果对比来 ComfyUI_Lam 人脸融合方案&#xff1a; demo效果还可以 ComfyUI_Lam: ComfyUI插件&#xff0c;人脸融合&#xff0c;视频加载&#xff0c;视…

智胜未来,新时代IT技术人风口攻略-第二版(弃稿)

文章目录 抛砖引玉 鸿蒙生态小科普焦虑之下 理想要落到实处校园鼎力 鸿蒙发展不可挡培训入场 机构急于吃红利企业布局 鸿蒙应用规划动智胜未来 技术人风口来临 鸿蒙已经成为行业的焦点&#xff0c;未来的发展潜力无限。作为一名程序员兼UP主&#xff0c;我非常荣幸地接受了邀请…