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