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.
原文地址:https://www.cnblogs.com/wuminyan/p/4744001.html