题目
在一个操场上一排地摆放着N堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。请设计一个程序,计算出将N堆石子合并成一堆的最小得分。
输入
每组数据第1行为一个正整数N(2<=N<=100),以下N行,每行一个正整数,小于10000,分别表示第i堆石子的个数(1<=i<=N)。
输出
对于每组数据输出一个正整数,即最小得分
输入样例
7
13
7
8
16
21
4
18
输出样例
239
解题思路
我这道题共用了三种方法:
方法一:枚举边界,然后枚举长度
则可以推出公式为:
f [ i ] [ j ] = m i n ( f [ i ] [ j ] , f [ i ] [ k ] + f [ k + 1 ] [ j ] + a [ j ] − a [ i − 1 ] ) ; f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+a[j]-a[i-1]); f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+a[j]−a[i−1]);
方法二:先枚举长度,再枚举边界
则可以推出公式为:
f [ i ] [ j ] = m i n ( f [ i ] [ j ] , f [ i ] [ k ] + f [ k + 1 ] [ j ] + a [ j ] − a [ i − 1 ] ) ;