1.问题描述
在一个圆形操场的四周摆放着n 堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。试设计一个算法,计算出将n堆石子合并成一堆的最小得分和最大得分。
2.动态规划or贪心算法
动态规划:用来求解最优性质的解,将原问题划分为若干个子问题,先求解子问题的解,由子问题的解求出原问题的解。这些子问题往往不互相独立,所以我们用一个表(在具体代码中经常用数组)来存储子问题的解避免重复求解。动态规划需要满足的条件为最优子结构性质即问题的最优解所包含的子问题的解也是最优的。同时需要满足子问题的重叠性和无后效性即某状态以后的过程不会影响以前的状态,只与当前状态有关。
贪心算法:同样用来求解具有最优性质的解,总是做出当前状态下的最优选择。希望得到的最终结果也是最优的。贪心算法求解最优解的条件有两个:贪心选择性质——问题的最优解可以通过局部最优解得到;最优子结构性质。
动态规划和贪心算法的主要区别在于动态规划采用自底向上的方式求解问题,贪心算法则是采用自顶向下的方法进行求解,以迭代方式继续做出贪心选择,将问题规模变为规模更小的自问题。
言归正传,石子合并问题是否可以采用贪心算法?以求得最小合并数为例,如果采用贪心算法,每次做的贪心选择为总是合并两个相邻的石子个数最小的两堆。假如有五堆石子数分别为:8 7 6 8 。
第一次合并:8 7 6 8 。得分13
第二次合并:8 13 8 。得分13+ 21
第三次合并:21 8。得分13+21+29
不采用贪心算法:
第一次合并:8