区间型动态规划,j要逆序枚举,f[i,j]表示从第i堆到第j堆石子合并所需的最小代价。

var
  w:array[0..105]of longint;
  f,sum:array[0..105,0..105]of longint;
  i,n,j,x,y,k:longint;

function min(x,y:longint):longint;
  begin
    if x>y
    then min:=y
    else min:=x
  end;

begin
  readln(n);
  for i:=1 to n do
  read(w[i]);
  fillchar(sum,sizeof(sum),0);
  fillchar(f,sizeof(f),0);
  for i:=1 to n do
    for j:=1 to n do
      for k:=i to j do
        inc(sum[i,j],w[k]);
  for i:=n-1 downto 1 do
    for j:=i+1 to n do
      begin
        f[i,j]:=maxlongint;
        for k:=i to j do
          f[i,j]:=min(f[i,j],f[i,k]+f[k+1,j]+sum[i,j])
      end;
  writeln(f[1,n])
end.

posted on 2015-04-06 21:48  ANTHB11  阅读(92)  评论(0)    收藏  举报