P1040 加分二叉树

该博客讨论了P1040加分二叉树问题,介绍了如何在满足给定中序遍历的二叉树中找到得分最小的树。解题思路包括搜索问题、记忆化搜索以及前序遍历的实现。博主通过递归和记忆化搜索策略来避免重复计算,最终输出得分和前序遍历序列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接

P1040 加分二叉树

题目梗概

我们知道中序遍历相同的二叉树可能有很多种,请在满足给定的中序遍历的二叉树中,找出得分最小二叉树,输出它的得分和前序遍历。
得分规则:树的得分 = 左子树的得分 * 右子树的得分 + 根节点的得分。
特别的,若没有左(右)子树,则左(右)子树得分为1。
若为叶子节点,则得分就是叶子节点的分数。
注:题目中给出的中序遍历是每个结点上的分数,并非结点编号,输入序号即为结点编号。
需要输出的前序遍历中,要的是结点编号,而非结点分数。

解题思路

搜索所有可能的二叉树,得到最优的结果。

搜索问题

我们知道中序遍历是由三部分组成,即左子树,根结点,右子树。当我们选择了根节点之后,左边的就是左子树的中序遍历,右边的就是右子树的中序遍历。
如果我们不考虑左子树,右子树它们各自的内部结构,那么对于一棵二叉树而言,把根节点的所有可能都搜索一边,那就相当于把这棵树所有可能都搜索一边。借用递归思想,我们分别对左右子树进行相同的操作,那最终就可以真正得把所有可能的二叉树都搜索完毕。

记忆化搜索问题

这里建立dp数组,就是把当前情况计算后的结果存储下来,当下一次再遇到同样情况时,可以直接获取结果,避免重复搜索计算。
例如对于总序列[1,2,3,4,5]中的子序列[1,2]
我们会在以3为一级根节点时,[1,2]会被作为一级左子树计算一遍。
当我们以4作为一级根节点时,一级左子树成为了[1,2,3],如果此时我们再以3作为二级根节点,[1,2]会被作为二级左子树再被计算一遍。
这里的作为二级左子树的[1,2]和上面作为一级左子树的[1,2],在计算结果上显然没有什么不同。这种情况就是我们所说的重复情况。

前序遍历

在上面的搜索计算的过程中,我们可以得到在序列区间[a,b]n内让哪个结点作为根节点为最优,我们记录下来,最后再利用递归方法,把前序序列打印出来。

完整代码

#include <iostream>
using namespace std;
int n;
int d[30],sp[30][30] = {0};
unsigned dp[30][30] = {0};

unsigned int dfs(int begin, int end){
	//[begin,end]是当前树的中序序列的存储范围 
	if(begin > end) return 1;
	if(begin == end){
		return d[begin];
	}
	if(dp[begin][end] != 0) return dp[begin][end];
	
	unsigned int _max = 1, tmp, node;
	//遍历根节点的所有可能 
	for(int i = begin;i<=end;i++){
		tmp =  dfs(i+1, end) * dfs(begin, i-1)+ d[i];
		if(tmp > _max){
			_max = tmp;
			node = i;
		}
	}
	sp[begin][end] = node;
	dp[begin][end] = _max;
	return _max;
}

void print(int begin, int end){
	if(begin > end) return;
	if(begin == end){
		cout << begin + 1 << " ";
		return; 
	}
	int node = sp[begin][end];
	cout << node + 1 << " ";
	print(begin,node-1);
	print(node+1,end);	
}

int main(){
	cin >> n;
	for(int i = 0;i<n;i++) cin >> d[i];
	cout << dfs(0, n-1) << endl;
	print(0, n-1);
	return 0;
} 
内容概要:《2024年中国城市低空经济发展指数报告》由36氪研究院发布,指出低空经济作为质生产力的代表,已成为中国经济的增长点。报告从发展环境、资金投入、创能力、基础支撑和发展成效五个维度构建了综合指数评价体系,评估了全国重点城市的低空经济发展状况。北京和深圳在总指数中名列前茅,分别以91.26和84.53的得分领先,展现出强大的资金投入、创能力和基础支撑。低空经济主要涉及无人机、eVTOL(电动垂直起降飞行器)和直升机等产品,广泛应用于农业、物流、交通、应急救援等领域。政策支持、市场需求和技术进步共同推动了低空经济的快速发展,预计到2026年市场规模将突破万亿元。 适用人群:对低空经济发展感兴趣的政策制定者、投资者、企业和研究人员。 使用场景及目标:①了解低空经济的定义、分类和发展驱动力;②掌握低空经济的主要应用场景和市场规模预测;③评估各城市在低空经济发展中的表现和潜力;④为政策制定、投资决策和企业发展提供参考依据。 其他说明:报告强调了政策监管、产业生态建设和区域融合错位的重要性,提出了加强法律法规建设、人才储备和基础设施建设等建议。低空经济正加速向网络化、智能化、规模化和集聚化方向发展,各地应找准自身比较优势,实现差异化发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值