首页 > 代码库 > 关于石子合并
关于石子合并
有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
关于石子合并