(昨天的)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.

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