首页 > 代码库 > 关于石子合并

关于石子合并

有n堆石子排成一列,每堆石子有一个重量w[i], 每次合并可以合并相邻的两堆石子,一次合并的代价为两堆石子的重量和w[i]+w[i+1]。问安排怎样的合并顺序,能够使得总合并代价达到最小。

//石子如果能交换顺序的话就是哈夫曼树了

//但是不能交换的话我们就只能考虑合并的顺序了,由于这个题目有贪心的嫌疑。。我们研究一下相邻两组合并的性质(看原子操作划分元素咯)

比如说1 2 3

如果你先合并1 2,sum+=(1+2),然后再合并另一部分。。代价是(1+2)+3,sum+=(1+2)+3,最终sum=9

如果你先合并2 3,sum+=(2+3),然后再合并另一部分。。代价是1+(2+3),sum+=1+(2+3),最终sum=11

所以我们找到了这个最简单的情况之后,就能递归地找最小

因为情况多变。。你永远不知道往哪里走才好。。只有动态决策才行

但是呢。。这里有一个思考的坑。。或者说还不清晰。。我来实力分析一波。。

1 2 3 4 

我先来一波错误思想。。。每次合并最小的

(1+2) sum+=3

3 3 4

(3+3) sum+=6

6 4

只剩两个直接合并

(6+4)sum+=10

sum=19

我再来一波探索的思想

因为最小考虑的单元是3嘛。。所以你现在困惑的应该是1,2,3先合并哪个,2,3,4先合并哪个

考虑划分1,2,3,前面算过。。是先1+2比较好,然后再合并3,3 ,最后合并6,4  sum=3+6+10

考虑2,3,4,先加2,3比较好,然后再合并5,4,最后合并1,9 sum+=5+9+10

没推翻错误想法啊。。再造它一组数据好了

4 2 1 3

1 2 4 2 1 3 1 2

+3+3+3

3 4 3 3 3

+6

3 4 3 6

发现歧义。。合并哪边呢

假如是从前往后遍历的第一个最小的

那么就是

+7

7 3 6

+9

7 9

+16

16

sum=47

====

3 4 3 6

合并后面那个4 3的话

+7

3 7 6

+10

10 6

+16

sum=48

显然这两者的选择造成的结果不同。。而我们的最优决策则认为它们是一样的。。

这个信息真的是。。你跑过之后才知道。。不跑不知道的。。

其实主要是 3 4 3 6

主要是合并成 7 3 6,3 7 6的不同

一组能取到3,6,一组取不到3,6

 

关于石子合并