设有一排数,共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个整数的序列的归并过程及最终结果。
1682

被折叠的 条评论
为什么被折叠?



