一、问题分析
1.1问题内容描述
在一个圆形操场的四周摆放着n堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。试设计一个算法,计算出将n堆石子合并成一堆的最小得分和最大得分。
1.2 问题的基本要求
对于任意给定的n堆石子,计算合并成一堆的最小得分和最大得分。
1.3分析
环形结构,经常采用双倍长度线性化手段,也就是说,把环形结构看成是长度为环的两倍的线性结构来处理,应用动态规划。
二、设计思路
2.1描述解决方案
以求解最小值为例
1. 我们为了将环形变为直线,必须规定转动顺序,这里采用逆时针转动,且以 i 作为起点,j作为终点。
2. 当规定好终点了,那么这环形有4种情况,我们求在这四种情况下最小的。
3. 关于转换成直线,比如存在 a(0) -> b(1) -> c(2) -> d(3) 与 d(3) -> a(4) -> b(5) -> c(6)。第一条是 i=0,j=3的数组,第二条是 i=3,j=6 的数组。 这样,我们就不用返回去计算了。
4. 四种情况分别是数组中的四行,每行最后一个代表遍历的结果,我们最后只需要遍历这四个值,找到最小值即可。
2.2算法思想
以得分最大举例。
如果将环形转换为直线,其核心思想就是:通过将数量变为 2n来转换成直线问题。 比如:数组v(1,2,3,4),但是题目中的要求是1也可以和4连上,所以我们可以把数组v当成 (1,2,3,4,1,2,3,4)。这样子的话,我们就可以算出 (2,3,4,1)的,(3,4,1,2),(4,1,2,3)的了。
sum数组的含义: sum[i]就是从数组v[1]到数组v[i]的和。
- 问题及解决方案
3.1问题1
开始以为通过贪心算法可能很快解决问题&#x