最小代价子母树

介绍了一种用于求解给定序列中所有元素通过不断两两归并直至形成单个元素时,使得总的归并代价最小的算法。文章通过具体实例展示了如何实现这一算法,并给出了一个包含10个整数的序列的归并过程及最终结果。

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

 

设有一排数,共n个,例如:22,14,7,13,26,15,11。任意两个相邻的数可以进行归并,归并的代价为

 

该两个数的和,经过不断的归并,最后归为一个堆,而全部归并代价的和称为总代价,给出一种归并算法,

 

使代价为最小。例如有3个数,12 7 8。

12 7 8    12  7 8

|   / /        /   /  |

19 /           /  15

 / /               / /

 27              27

 

如上,归并的过程有2种:19+27=46 和 15+27=42。由此可见第二种归并方法总代价为最小。

 

题目来自“全国少年信息学(计算机)竞赛例题解析”

 

有两个强调的地方:

1.数的归并是有顺序的,只有相邻的数才能归并。

2.只能两两归并(可能是废话)

最初打算采用递归的方式发现不可行。

一下代码:

MinCostTree.h

 

MinCostTree.cpp

 

int input[]={3,18,7,14,10,12,23,41,16,24}的结果:

 

000 000 000 000 000 000 000 000 000 000 

021 025 021 024 022 035 064 057 040 

049 060 052 058 067 111 137 121 

084 098 086 117 153 184 208 

125 143 152 217 226 267 

170 211 257 290 314 

238 332 332 378 

362 409 420 

439 497 

527 

min value=527

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值