CODEVS 2102 石子归并 2
【题目描述 Descriptin】
在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。
试设计出1个算法,计算出将N堆石子合并成1堆的最小得分和最大得分.
【输入描述 Input Description】
数据的第1行试正整数N,1≤N≤100,表示有N堆石子.第2行有N个数,分别表示每堆石子的个数.
输出描述 Output Description
输出共2行,第1行为最小得分,第2行为最大得分.
【样例输入 Sample Input】
4
4 4 5 9
【样例输出 Sample Output】
43
54
【解题思路】
经典环形DP,公式大家都懂,最后寻找最大值从f[1,n],f[2,n+1]……等中找
1 program StongUnion; 2 var 3 f1,f2:array[0..100,0..100] of longint; 4 a,s:array[0..100] of longint; 5 i,j,p,k,n,ans1,ans2:Longint; 6 begin 7 read(n); 8 for i:=1 to n do 9 begin 10 read(a[i]); 11 s[i]:=s[i-1]+a[i]; 12 a[i+n]:=a[i]; 13 end; 14 for i:=n+1 to 2*n do 15 s[i]:=s[i-1]+a[i]; 16 17 for p:=1 to n-1 do 18 for i:=1 to n*2-p do 19 begin 20 j:=i+p; 21 f1[i,j]:=maxint;; 22 f2[i,j]:=0; 23 for k:=i to j-1 do 24 begin 25 if f1[i,j]>f1[i,k]+f1[k+1,j] then 26 f1[i,j]:=f1[i,k]+f1[k+1,j]; 27 if f2[i,j]<f2[i,k]+f2[k+1,j] then 28 f2[i,j]:=f2[i,k]+f2[k+1,j]; 29 end; 30 f1[i,j]:=f1[i,j]+s[j]-s[i-1]; 31 f2[i,j]:=f2[i,j]+s[j]-s[i-1]; 32 end; 33 ans1:=maxlongint div 2; 34 ans2:=-1; 35 for i:=1 to n do 36 begin 37 if f1[i,n+i-1]<ans1 then ans1:=f1[i,n+i-1]; 38 if f2[i,n+i-1]>ans2 then ans2:=f2[i,n+i-1]; 39 end; 40 writeln(ans1); 41 writeln(ans2); 42 end.