(昨天的)codevs天梯 石子归并

题目:

有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.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章