最小代价子母树

 

设有一排数,共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

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值