題目:
有n堆石子排成一列,每堆石子有一個重量w[i], 每次合併可以合併相鄰的兩堆石子,一次合併的代價爲兩堆石子的重量和w[i]+w[i+1]。問安排怎樣的合併順序,能夠使得總合並代價達到最小。
分析:
一道dp題,很經典,狀態轉移方程爲:f[i,j]:=f[i,k]+f[k+i,j-k]+sum[i,j];
代碼:
const
maxn=200;
var
f,sum:array [-maxn..maxn,-maxn..maxn]of longint;
a:array [-maxn..maxn] of longint;
n:longint;
procedure init;
var
i,j:longint;
begin
readln(n);
for i:=1 to n do
begin
read(a[i]);
sum[i,1]:=a[i];
f[i,1]:=0;
end;
for i:=2 to n do
for j:=1 to n-i+1 do
sum[j,i]:=a[j]+sum[j+1,i-1];
end;
procedure main;
var
i,j,k:longint;
begin
for j:=2 to n do
for i:=1 to n-j+1 do
begin
f[i,j]:=maxlongint;
for k:=1 to j-1 do
if (f[i,k]+f[k+i,j-k]+sum[i,j])>f[i,j] then
f[i,j]:=f[i,k]+f[k+i,j-k]+sum[i,j];
end;
end;
begin
init;
main;
writeln(f[1,n]);
end.