不能移动的石子合并
做如下两个模型的石子合并,如下模型石子都不能移动出列,且合并都仅发生在相邻两堆石子中:
(1)第一个模型:一行排列且相邻合并
有n堆石子形成一行(a1,a2,…,an,ai为第i堆石子个数),相邻两堆可合并,合并的分值为新堆的石子数。求合并为一堆的最低得分和最高得分。
(2)第二个模型:一圈排列且相邻合并
有n堆石子形成首位相连的一个环形(a1,a2,…,an,ai为第i堆石子个数,an和a1相邻),相邻两堆可合并,合并的分值为新堆的石子数。求合并为一堆的最低得分和最高得分。
例如4堆石子,每堆石子个数:9 4 4 5
若排成一行,最小分值:(4+4)+(8+5)+(9+13)=43,最大分值:(9+4)+(13+4)+(17+5)=52。
若排成圈状,最小分值:(4+4)+(8+5)+(9+13)=43,最大分值:(9+5)+(14+4)+(18+4)=54。
此题以第一模型的最低得分为例,很多同学想着采用总是从最小的相邻两堆下手的思想,认为最后获得的也就是最低得分。但这个贪心策略是不对的。
如下反例:
石子:9 4 6 1 5
贪心策略:
9 4 6 6 计分6
9 10 6 计分10
9 16 计分16
25 计分25
得分共计:6+10+16+25=57
但9 4 6 1 5 若如下方式合并:
13 6 1 5 计分13
13 6 6 计分6
13 12 计分12
25 计分25
13+6+12+25=56
或
9 4 6 6 计分6
9 4 12 计分12
13 12 计分13
25 计分25
6+12+13+25=56
后两种方式合并出的56都比贪心策略的57来的更低,因为总选择最小的相邻两堆去合并,并不能保证后续每步都可以最小,也许这轮最小导致后续几轮分值较大。
输入格式
两行。第一行n,第二行a1 a2 … an,每个ai(1<=i<=n)表示第i堆石子的个数,n<=100
输出格式
两行。第一行是第一个模型的最低得分和最高得分,中间空格相连,第二行是第二个模型的最低得分和最高得分,中间空格相连。
输入样例
4
9 4 4 5
输出样例
43 52
43 54
分析:
开始看到两种模型好烦啊T_T,反正我是写了四个函数分别算的。这道题就有点经典了,如果没整理好思路,代码有得调的了。先摆公式:
本次积分 = 左边石头+右边石头+左边积分+右边积分。
思路也很简单,要求出[m, n]这个区间(m可以大于n)中累加的最优值,那么肯定是从区间中找到一点k(m <= k <n),使得[m, k]和[k+1, n]这两个子问题分别最优,然后将所有k值枚举,取最优值作为本次最优,算是子问题的分解吧。分解到什么时候是个头呢?很简单,到只有两个数的时候,k只有一种取值,那么肯定已经是最优的了,这里采用自底向上方式,填表分析。
下面贴上第二种模型的分析过程:
模型二比较复杂,拿上面的 9 4 4 5 作为分析数据,取最大值
当 | n - m | == 1 的时候,已经是最优问题,直接两个数相加。
| n | ||||
m | 0 | 1 | 2 | 3 | 4 |
1 | 0 |
|
|
| |
2 | 13 | 0 |
|
| |
3 |
| 8 | 0 |
| |
4 |
|
| 9 | 0 |
当 |n-m| == 2 的时候:
[1,3]
9 4 4
1:
9/4 4
9 + 8 + 0 + 8 = 25
2:
9 4/4
13 + 4 + 13 + 0 = 30
[2,4]
4 4 5
1:
4/4 5
4 + 9 + 0 + 9 = 22
2:
4 4/5
8 + 5 + 8 + 0 = 21
[3,1]
4 5 9
1:
4/5 9
4 + 14 + 0 + 14 = 32
2:
4 5/9
9 + 9 + 9 + 0 = 27
[4,2]
5 9 4
1:
5/9 4
5 + 13 + 0 + 13 = 31
2:
5 9/4
14 + 4 + 14 + 0 = 32
| n | ||||
m | 0 | 1 | 2 | 3 | 4 |
1 | 0 |
| 32 | 14 | |
2 | 13 | 0 |
| 32 | |
3 | 30 | 8 | 0 |
| |
4 |
| 22 | 9 | 0 |
当 |n - m| == 3 的时候
[1,4]
9 4 4 5
1:
9/4 4 5
9 + 13 + 0 + 22 = 44
2:
9 4/4 5
13 + 9 + 13 + 9 = 44
3:
9 4 4/5
17 + 5 + 30 + 0 = 52
[2,1]
4 4 5 9
1:
4/4 5 9
4 + 18 + 0 + 32 = 54
2:
4 4/5 9
8 + 14 + 8 + 14 = 44
3:
4 4 5/9
13 + 9 + 22 + 0 = 44
[3,2]
4 5 9 4
1:
4/5 9 4
4 + 18 + 0 + 32 = 54
2:
4 5/9 4
9 + 13 + 9 + 13 = 44
4 5 9/4
18 + 4 + 32 + 0 = 54
[4,1]
1 9 4 4
1:
1/9 4 4
1 + 17 + 0 + 30 = 48
2:
1 9/4 4
10 + 8 + 10 + 8 = 36
3:
1 9 4/4
14 + 4 + 27 + 0 = 45
| n | ||||
m | 0 | 1 | 2 | 3 | 4 |
1 | 0 | 54 | 32 | 14 | |
2 | 13 | 0 | 54 | 32 | |
3 | 30 | 8 | 0 | 54 | |
4 | 52 | 22 | 9 | 0 |
接着在上面表格中,找到[1,4]、[2,1]、[3,2]、[4,3]中的一个最大值,返回即可