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 這個區間內聚合的最大值 對於每...