最小代價樹(動態規劃)

2021-07-11 02:00:05 字數 1468 閱讀 4007

description

以下方法稱為最小代價的字母樹:給定一正整數序列,例如:4,1,2,3,在不改變量的位置的條件下把它們相加,並且用括號來標記每一次加法所得到的和。 

例如:((4+1)+ (2+3))=((5)+(5))=10。除去原數不4,1,2,3之外,其餘都為中間結果,如5,5,10,將中間結果相加,得到:5+5+10=20,那麼數20稱為此數列的乙個代價,若得到另一種演算法:(4+((1+2)+3))=(4+((3)+3))=(4+(6))=10,數列的另乙個代價為:3+6+10=19。若給出n個數,可加n-1對括號,求出此數列的最小代價。 

注:結果範圍不超出longint. 

input

第一行為數n(1≤n≤200),第二行為n個正整數,整數之間用空格隔開。

output

輸出僅一行,即為最少代價值。

sample input

4

4 1 2 3

sample output

19
解題思路:
f[i,j]表示把第i個數和第j個數合併的最優值,狀態轉移方程為:
f[i,j]=min
(n>=i>=1,i<=k
f[1,n]即為所求。
時間複雜度:o(n^3)
程式:
const

maxn=200;

var f,sum:array[0..200,0..200]of longint;

a:array[0..200]of longint;

n,i,j,k,l:longint;

function min(a,b:longint):longint;

begin

if a

end;

begin

readln(n);

for i:=1 to n do

read(a[i]);

for i:=1 to n do

begin

f[i,i]:=0;

sum[i,i]:=a[i];

for j:=i+1 to n do

sum[i,j]:=sum[i,j-1]+a[j];

end;

for l:=2 to n do

for i:=1 to n-l+1 do

begin

j:=l+i-1;

f[i,j]:=maxlongint;

for k:=i to j-1 do

f[i,j]:=min(f[i,j],f[i,k]+f[k+1,j]+sum[i,j]);

end;

writeln(f[1,n]);

end.

版權屬於: chris

最小編輯代價(動態規劃)

在nowcoder上的題目,原題如下 對於兩個字串a和b,我們需要進行插入 刪除和修改操作將a串變為b串,定義c0,c1,c2分別為三種操作的代價,請設計乙個高效演算法,求出將a串變為b串所需要的最少代價。給定兩個字串a和b,及它們的長度和三種操作代價,請返回將a串變為b串所需要的最小代價。保證兩串...

最小編輯代價(動態規劃)

實現 對於不同的要求,主要是找到求dp i j 的規律。include include include include include include include using namespace std define max length 50 字串的最大長度 求出dp i j 代表從str1 ...

最小編輯代價 動態規劃

對於兩個字串a和b,我們需要進行插入 刪除和修改操作將a串變為b串,定義c0,c1,c2分別為三種操作的代價 給定三種操作代價,字串a和b,求出將a串變為b串所需要的最少代價。保證兩串長度均小於等於300,且三種代價值均小於等於100。測試樣例 5 3 100 abc adc 返回 8 public...