洛谷 P1880 石子合併

2021-07-26 10:49:48 字數 1721 閱讀 5695

題目描述

在乙個園形操場的四周擺放n堆石子,現要將石子有次序地合併成一堆.規定每次只能選相鄰的2堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。

試設計出1個演算法,計算出將n堆石子合併成1堆的最小得分和最大得分.

輸入輸出格式

輸入格式:

資料的第1行試正整數n,1≤n≤100,表示有n堆石子.第2行有n個數,分別表示每堆石子的個數.

輸出格式:

輸出共2行,第1行為最小得分,第2行為最大得分.

輸入輸出樣例

輸入樣例#1:

4 4 5 9 4

輸出樣例#1:

43 54

分析:先把環變為線。就是把數列copy一遍。然後我們知道,

設f[i,j]為和並i–j的代價,有

f[i,j]=max(f[i,j],f[i,k]+f[k+1,j]+sum(a[i]~a[j]));

(其他區間和並成這兩個區間的代價+這兩個區間和並成乙個區間的代價)

**:

var

a,sum:array [0..201] of longint;

f,f1:array [1..201,1..201] of longint;

n,m,i,j,q,ma,mi,k:longint;

function

max(x,y:longint):longint;

begin

if x>y then

exit(x)

else

exit(y);

end;

function

min(x,y:longint):longint;

begin

if xthen

exit(x)

else

exit(y);

end;

begin

readln(n);

for i:=1

to n do

begin

read(a[i]);

a[i+n]:=a[i];

end;

for i:=1

to2*n do

sum[i]:=a[i]+sum[i-1];

mi:=maxlongint;

for j:=1

to2*n do

for i:=1

to2*n-j+1

dobegin

q:=i+j-1;

if q=i then

begin

f[i,q]:=0;

f1[i,q]:=0;

continue;

end;

f1[i,q]:=maxlongint;

for k:=i to q-1

dobegin

f[i,q]:=max(f[i,k]+f[k+1,q]+sum[q]-sum[i-1],f[i,q]);

f1[i,q]:=min(f1[i,k]+f1[k+1,q]+sum[q]-sum[i-1],f1[i,q]);

end;

if j=n then

begin

if f[i,q]>ma then ma:=f[i,q];

if f1[i,q]then mi:=f1[i,q];

end;

end;

writeln(mi);

writeln(ma);

end.

洛谷P1880 石子合併

描述 在乙個園形操場的四周擺放n堆石子,現要將石子有次序地合併成一堆.規定每次只能選相鄰的2堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。試設計出1個演算法,計算出將n堆石子合併成1堆的最小得分和最大得分.輸入格式 資料的第1行試正整數n,1 n 100,表示有n堆石子.第2行有n個數...

洛谷 P1880 石子合併

一道區間 dp的典型題目。下面,我們先考慮不在環上,而在一條鏈上的情況。令狀態 f i,j 表示將下標在 i,j 區間的元素合併起來所能獲得的最大價值,則 f 1,n 就是問題的答案。狀態轉移式為 f i,j max quad k in i,j cost i,j,k 表示將區間 i,k 和 k 1,...

洛谷 P1880 石子合併 環形

在乙個圓形操場的四周擺放n堆石子,現要將石子有次序地合併成一堆.規定每次只能選相鄰的2堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。試設計出1個演算法,計算出將n堆石子合併成1堆的最小得分和最大得分.輸入格式 資料的第1行試正整數n,1 n 100,表示有n堆石子.第2行有n個數,分別...