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