洛谷P1063 能量項鍊 區間DP

2022-09-03 04:57:09 字數 1512 閱讀 5004

有nn

個珠子圍成一圈,每個珠子有能量值a[i

]a[i

],合併兩串已串起來的珠子[i,

j][i

,j]和[

j,k]

[j,k

]能獲得a[i

]×a[

j]×a

[k]a

[i]×

a[j]

×a[k

]能量。求把所有珠子合併的最大能量值。

很像石子歸併啊,肯定是區間dp。

那麼首先得破環為鏈。設f[

j][i

]f[j

][i]

為合併[j,

i][j

,i]能獲得的最大能量值,那麼很明顯可以列舉乙個k(j

≤kk(j≤

k,那麼就有f[

j][i

]=ma

x(f[

j][i

],f[

j][k

]+f[

k+1]

[i]+

a[j]

×a[k

+1]×

a[i+

1])f

[j][

i]=m

ax(f

[j][

i],f

[j][

k]+f

[k+1

][i]

+a[j

]×a[

k+1]

×a[i

+1])

即左邊合併的最大值+右邊合併的最大值+本次合併的能量

答案為max

(f[1

][n]

,f[2

][n+

1],f

[3][

n+2]

....

..f[

n][2

×n−1

])ma

x(f[

1][n

],f[

2][n

+1],

f[3]

[n+2

]...

...f

[n][

2×n−

1])

#include #include #include #define n 210  //破環為鏈陣列開大一倍

using namespace std;

int n,a[n],f[n][n],ans;

int main()

for (int i=1;i<=2*n;i++) //列舉右端點

for (int j=i-1;j>0;j--) //列舉左端點

for (int k=j;kf[j][i]=max(f[j][i],a[j]*a[k+1]*a[i+1]+f[j][k]+f[k+1][i]);

for (int i=1;i<=n;i++)

ans=max(ans,f[i][i+n-1]);

printf("%d\n",ans);

return 0;

}

洛谷P1063 能量項鍊 區間DP

有nn 個珠子圍成一圈,每個珠子有能量值a i a i 合併兩串已串起來的珠子 i,j i j 和 j,k j,k 能獲得a i a j a k a i a j a k 能量。求把所有珠子合併的最大能量值。很像石子歸併啊,肯定是區間dp。那麼首先得破環為鏈。設f j i f j i 為合併 j,i ...

P1063 能量項鍊 區間DP

在mars星球上,每個mars人都隨身佩帶著一串能量項鍊。在項鍊上有n顆能量珠。能量珠是一顆有頭標記與尾標記的珠子,這些標記對應著某個正整數。並且,對於相鄰的兩顆珠子,前一顆珠子的尾標記一定等於後一顆珠子的頭標記。因為只有這樣,通過吸盤 吸盤是mars人吸收能量的一種器官 的作用,這兩顆珠子才能聚合...

P1063 能量項鍊 區間dp

輸入 1複製 4 2 3 5 10 輸出 1複製 710 noip 2006 提高組 第一題 思路 很像石子合併的一道題,只不過把獲得的價值給改了一下。如果有兩堆石子可以合併,分別為 i k k 1,j 獲得的價值為 head i tail k tail j 然後像石子合併那樣做就可以了。code ...