加分二叉树
  gBkHYLY8jvYd 2023年11月19日 25 0

[NOIP2003 提高组] 加分二叉树

题目描述

设一个 加分二叉树_#include 个节点的二叉树 加分二叉树_#include_02 的中序遍历为加分二叉树_#include_03,其中数字 加分二叉树_结点_04 为节点编号。每个节点都有一个分数(均为正整数),记第 加分二叉树_#include_05 个节点的分数为 加分二叉树_子树_06加分二叉树_#include_02 及它的每个子树都有一个加分,任一棵子树 加分二叉树_#include_08(也包含 加分二叉树_#include_02 本身)的加分计算方法如下:

加分二叉树_#include_08 的左子树的加分 加分二叉树_结点_11 加分二叉树_#include_08 的右子树的加分 加分二叉树_子树_13 加分二叉树_#include_08 的根的分数。

若某个子树为空,规定其加分为 加分二叉树_#include_15,叶子的加分就是叶节点本身的分数。不考虑它的空子树。

试求一棵符合中序遍历为 加分二叉树_#include_03 且加分最高的二叉树 加分二叉树_#include_02。要求输出

  1. 加分二叉树_#include_02 的最高加分。
  2. 加分二叉树_#include_02 的前序遍历。

输入格式

加分二叉树_#include_15加分二叉树_#include_15 个整数 加分二叉树_#include,为节点个数。

加分二叉树_结点_23加分二叉树_#include 个用空格隔开的整数,为每个节点的分数

输出格式

加分二叉树_#include_15加分二叉树_#include_15 个整数,为最高加分($ Ans \le 4,000,000,000$)。

加分二叉树_结点_23加分二叉树_#include 个用空格隔开的整数,为该树的前序遍历。

样例 #1

样例输入 #1

5
5 7 1 2 10

样例输出 #1

145
3 1 2 4 5

提示

数据规模与约定

对于全部的测试点,保证 加分二叉树_结点_29,节点的分数是小于 加分二叉树_#include_30 的正整数,答案不超过 加分二叉树_结点_31



#include<iostream>
#include<cmath>
#include<cstdio>
int n;
int f[35];
int s[35][35],p[35][35];
using namespace std;
int dfs(int l,int r)
{
	if(l>r)return 1;//如果交叉则说明此结点无儿子,则默认为权值为1 
	if(l==r){s[l][r]=l;return f[l];}//如果正好只有一个结点的,那么直接返回该结点的值 
	if(p[l][r])return p[l][r];//①记忆化搜索 
	int ans=0,num;
	for(int k=l;k<=r;k++)//枚举子层次的根节点 
	{
		int t=dfs(l,k-1)*dfs(k+1,r)+f[k];
		if(t>ans)
		{
			ans=t;//取得以此根为结点的权值的最优 
			num=k;// 标记以在l~r这些子结点之中以num为根是最优结果 
		}
	}
	s[l][r]=num;//记忆 num
	return p[l][r]=ans;//记忆化 
}
void zhao(int l,int r)
{
	if(l>r)return;
	cout<<s[l][r]<<" ";//输出根 
	zhao(l,s[l][r]-1);//递归输出左结点 
	zhao(s[l][r]+1,r);//递归输出右结点 
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)cin>>f[i];
	cout<<dfs(1,n)<<endl;
	zhao(1,n);
	return 0;
}
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月19日 0

暂无评论

推荐阅读
  gBkHYLY8jvYd   2023年12月06日   50   0   0 #includecii++
  gBkHYLY8jvYd   2023年11月19日   27   0   0 #includecic++
  gBkHYLY8jvYd   2023年11月19日   14   0   0 #includeios数据
  gBkHYLY8jvYd   2023年11月19日   26   0   0 #include子树结点
  gBkHYLY8jvYd   2023年11月19日   24   0   0 #includei++数据
  gBkHYLY8jvYd   2023年11月19日   27   0   0 #include数组ci
  gBkHYLY8jvYd   2023年12月10日   18   0   0 #include邻域灰度图像
  gBkHYLY8jvYd   2023年12月12日   19   0   0 最短路径最短路结点
  gBkHYLY8jvYd   2023年12月10日   22   0   0 #include数组i++
  gBkHYLY8jvYd   2023年12月06日   19   0   0 #includeios数据
  gBkHYLY8jvYd   2023年12月08日   20   0   0 #includecii++
  gBkHYLY8jvYd   2023年11月19日   23   0   0 #includeiosci
  gBkHYLY8jvYd   2023年11月22日   23   0   0 #include十进制高精度
  gBkHYLY8jvYd   2023年11月22日   26   0   0 #includeiosci
gBkHYLY8jvYd
作者其他文章 更多

2023-12-12

2023-12-11

2023-12-10

2023-12-10

2023-12-09

2023-12-08

2023-12-06

2023-12-06

2023-12-06