题目:
有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.