NOIP2006(能量項鍊)

2021-05-27 00:24:21 字數 1640 閱讀 7210

program energy;

var n,m:longint;

head,tail:array [1..200] of longint;//head[i]與tail[i]分別表示第i個珠子的頭標記與第i個珠子的尾標記。

f:array [1..200,1..200] of longint;//f[i,j]表示從第i個珠子到第j個珠子合併之後取得的值。

procedure init;

var i:longint;

begin

readln(n);

for i:=1 to n do read(head[i]);//先讀入每個珠子的頭標記。

for i:=1 to n-1 do tail[i]:=head[i+1];//每個珠子的尾標記等於下乙個珠子的頭標記。

tail[n]:=head[1];

//這裡為了方便,把珠子數擴大2倍,避免了計算mod值,使序列變為了a[1],a[2],a[3]...a[n],a[1],a[2]...a[n-1]。

m:=(n << 1)-1;

for i:=n+1 to m do

begin

head[i]:=head[i-n];

tail[i]:=tail[i-n];

end;

end;

function max(x,y:longint):longint;

begin

if x>y then exit(x) else exit(y);

end;

procedure work;

var i,j,k,t:longint;

begin

for i:=1 to n-1 do//確定t的位置。

begin

for j:=1 to m-1 do//列舉每乙個位置的珠子。

begin

t:=i+j;

if t>m then break;//不能越界。

for k:=j to t-1 do f[j,t]:=max(f[j,t],f[j,k]+f[k+1,t]+head[j]*tail[k]*tail[t]);//從第j個珠子到第t個珠子合併可以從k處斷開,即從j到k的最大+從k+1到t的最大再加上head[j]*tail[k]*tail[t],即是完成這次合併的值。

end;

end;

end;

procedure outit;

var i,maxx:longint;

begin

maxx:=-maxlongint;

for i:=1 to n do if f[i,i+n-1]>maxx then maxx:=f[i,i+n-1];//列舉通過打擂台找最大值。因為最後是n個珠子合併後的最大值,因此是f[i,i+n-1]。

writeln(maxx);

end;

begin

assign(input,'energy.in'); reset(input);

assign(output,'energy.out'); rewrite(output);

init;

work;

outit;

close(input); close(output);

end.

NOIP 2006 能量項鍊

洛谷傳送門 jdoj傳送門1 jdoj傳送門2 在mars星球上,每個mars人都隨身佩帶著一串能量項鍊。在項鍊上有n顆能量珠。能量珠是一顆有頭標記與尾標記的珠子,這些標記對應著某個正整數。並且,對於相鄰的兩顆珠子,前一顆珠子的尾標記一定等於後一顆珠子的頭標記。因為只有這樣,通過吸盤 吸盤是mars...

NOIP2006 能量項鍊

額,和石子合併好像的qwq。的確和石子合併很像,我們定義狀態dp i j 表示從第i顆到第j顆所能釋放的最大能量,顯然,dp i j max dp i j dp i k dp k 1 j head i tail k tail j 可以認為是先將i到k合併成一顆珠子,再將k 1到j合併成一顆珠子,最後...

NOIP2006 提高組 能量項鍊

首先,我們肯定要把每個珠子都聚合是能量最大的基礎,而對於這個環,我們可以在輸入時預處理成這個樣子 1 2 3 4 1 2 3 然後發現這個環的所有遍歷情況變得很簡單 以某個為起點,向後取n個就行 現在,我們只要發現這是個區間dp就行了 f i j 表示,從 i 到 j 這個區間內聚合的最大值 對於每...