合併類動態規劃 石子合併(洛谷1880)

2022-08-15 04:24:13 字數 1626 閱讀 5877

題目描述description

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

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

輸入輸出格式input/output

輸入格式:

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

輸出格式:

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

輸入輸出樣例sample input/output

樣例測試點#1

輸入樣例:4

4 5 9 4

輸出樣例:

**:

var n,i,j,k,l,minf,maxf:longint;

a,s:array[0..300] of longint;

f:array[1..300,1..300] of longint;

function min(x,y:longint):longint;

begin

if xy then 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 to 2*n-1 do

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

for l:=2 to n do //列舉可能的長度

for i:=1 to 2*n-l do //環形擴充套件到鏈

begin

j:=i+l-1;

f[i,j]:=maxlongint;

for k:=i to j-1 do

f[i,j]:=min(f[i,j], f[i,k]+f[k+1,j]+s[j]-s[i-1]);

end;

minf:=maxlongint;

for i:=1 to n do minf:=min(minf,f[i,i+n-1]); //求出最小的值

fillchar(f,sizeof(f),0);

for l:=2 to n do

for i:=1 to 2*n-1 do

begin

j:=i+l-1;

f[i,j]:=0;

for k:=i to j-1 do

f[i,j]:=max(f[i,j], f[i,k]+f[k+1,j]+s[j]-s[i-1]);

end;

maxf:=0;

for i:=1 to n do maxf:=max(maxf,f[i,i+n-1]);

writeln(minf);

writeln(maxf);

end.

動態規劃 石子合併

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

石子合併動態規劃

在乙個園形操場的四周擺放n堆石子 n 100 現要將石子有次序地合併成一堆。規定每次只能選相鄰的兩堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。編一程式,由檔案讀入堆數n及每堆的石子數 20 選擇一種合併石子的方案,使得做n 1次合併,得分的總和最小 選擇一種合併石子的方案,使得做n ...

石子合併 動態規劃(環形)

1 問題描述 問題 nwpu noj 1148 在乙個圓形操場的四周擺放著n堆石子 n 100 現要將石子有次序地合併成一堆。規定每次只能選取相鄰的兩堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。編一程式,讀入石子堆數n及每堆的石子數 20 選擇一種合併石子的方案,使得做n 1次合併,...