能量項鍊 區間DP題解

2021-10-07 08:41:54 字數 2751 閱讀 2892

原題來自:noip 2006

在 mars 星球上,每個 mars 人都隨身佩帶著一串能量項鍊。在項鍊上有 n

nn 顆能量珠。能量珠是一顆有頭標記和尾標記的珠子,這些標記對應著某個正整數。並且,對於相鄰的兩顆珠子,前一顆珠子的尾標記必定等於後一顆珠子的頭標記。因為只有這樣,通過吸盤——mars 人吸收能量的器官的作用,這兩顆珠子才能聚合成一顆珠子,同時釋放出可被吸盤吸收的能量。如果一顆能量珠頭標記為 m

mm,尾標記為 r

rr,後一顆能量珠頭標記為 r

rr,尾標記為 n

nn,則聚合後釋放出 m×r

×n

m \times r \times n

m×r×

n mars單位的能量,新珠子頭標記為 m

mm,尾標記為 nnn。

當需要時,mars 人就用吸盤夾住相鄰的兩顆珠子,通過聚合得到能量,直到項鍊上只剩下一顆珠子為止。顯然,不同的聚合順序得到的總能量是不一樣的。請設計乙個聚合順序使得一串珠子聚合後釋放出的總能量最大。

現在給你一串項鍊,項鍊上有 n

nn 顆珠子,相鄰兩顆珠子可以合併成乙個,合併同時會放出一定的能量,不同珠子合併放出能量不相同,請問按怎樣的次序合併才能使得釋放的能量最多?

第一行乙個正整數 n(n

≤100

)n(n \leq 100)

n(n≤10

0)。第二行 n

nn 個不超過 1000

1000

1000

的正整數,第 i(1

≤1≤n

)i(1 \leq 1 \leq n)

i(1≤1≤

n)個數為第 i

ii 顆珠子的頭標記。

注意這是乙個環。至於珠子的順序,你可以這樣確定:將項鍊放在桌面上,不要出現交叉,隨機指定一顆珠子為第一顆珠子,按順時針確定其它珠子的順序。

輸出只有一行,乙個不超過 2.1×1

09

2.1\times10^9

2.1×10

9 的正整數,表示最優聚合順序所釋放的能量。

輸入

4

2 3 5 10

輸出
710
易知這是一道區間dp。令dp[

i][j

]dp[i][j]

dp[i][

j]為合併 i

ii 和 j

jj之間的項鍊所能釋放的最大能量,即最後 i

ii 到 j

jj 之間只能剩下一條項鍊。由區間dp的思想可知 dp[

i][j

]dp[i][j]

dp[i][

j]一定是由 dp[

i][k

]dp[i][k]

dp[i][

k]與 dp[

k+1]

[j

]dp[k + 1][j]

dp[k+1

][j]

合併而來的。(i≤

k

(i \leq k \lt j)

(i≤k

於是 dp[

l][r

]=ma

x(dp

[l][

r],d

p[l]

[k]+

dp[k

+1][

r]+a

[l].

x∗a[

r].y

∗a[k

].y)

;dp[l][r] = max(dp[l][r], dp[l][k] + dp[k + 1][r] + a[l].x * a[r].y * a[k].y);

dp[l][

r]=m

ax(d

p[l]

[r],

dp[l

][k]

+dp[

k+1]

[r]+

a[l]

.x∗a

[r].

y∗a[

k].y

);又因為此題為乙個,我們不知道序列的頭和尾在哪,這種時候一般可以把轉化為長度為 2n2n

2n的

#include

#include

#include

#include

#include

using

namespace std;

const

int maxn =

205;

int n, dp[maxn]

[maxn]

;struct node a[maxn]

;int

main()

for(

int i =

1; i <= n; i++

) a[i + n]

.x = a[i]

.x; a[i + n]

.y = a[i]

.y;}

for(

int len =

2; len <= n; len++)}

}for

(int i =

1; i <= n; i++

)printf

("%d"

, maxx)

;return0;

}

區間dp 能量項鍊

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

區間DP 能量項鍊

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

區間dp(能量項鍊)

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