洛谷P1063 能量項鍊 斷環為鏈 dp

2021-09-25 22:40:02 字數 2268 閱讀 8668

經典區間dp題,同時要用到斷環為鏈的思想,斷環為鏈在題目講解裡敘述

----------------------------------分割線---------------------------------------

子狀態:

d p[

i][j

]dp[i][j]

dp[i][

j]表示從第i顆到第j顆珠子合併後釋放能量的最大值。

分析:設這個區間的左端點為j

jj,右端點為ppp。

設a

aa為第j

jj顆到第k

kk顆珠子合併後釋放的最大值,即dp[

j][k

]dp[j][k]

dp[j][

k],設b

bb為dp[

k+1]

[p

]dp[k+1][p]

dp[k+1

][p]

。合併後增加了a[j

]∗a[

k+1]

∗a[p

+1

]a[j]*a[k+1]*a[p+1]

a[j]∗a

[k+1

]∗a[

p+1]

。所以可以推出狀態轉移方程:

d p[

j][p

]=ma

x(dp

[j][

p],d

p[j]

[k]+

dp[k

+1][

p]+a

[j]∗

a[k+

1]∗a

[p

]dp[j][p]=max(dp[j][p],dp[j][k]+dp[k+1][p]+a[j]*a[k+1]*a[p]

dp[j][

p]=m

ax(d

p[j]

[p],

dp[j

][k]

+dp[

k+1]

[p]+

a[j]

∗a[k

+1]∗

a[p]

對斷環為鏈的理解:

最後乙個珠子的尾標記為第一顆珠子的頭標記,構成了一條環。此時若用普通的判斷容易出錯(而且可能狀態轉移方程會很複雜)。

若將記錄的陣列開大兩倍,則第n+1

,n+2

,……,

2n

n+1,n+2,……,2n

n+1,n+

2,……

,2n顆珠子分別與第1,2

,……,

n1,2,……,n

1,2,……

,n顆珠子是等價的。

於是d p[

2][n

+1

]dp[2][n+1]

dp[2][

n+1]

就表示第2

22個珠子到第n+1

n+1n+

1個珠子合併後釋放能量的最大值,即第一顆珠子和最後一顆珠子合併。

易錯點:

第一層迴圈:應該列舉區間長度。

第二層迴圈:應該列舉區間的左端點的位置,並由左端點和長度算出右端點的位置。

第三層迴圈:應該列舉斷點(將左邊合併成的珠子與右邊合併成的珠子合併)。

---------------------------------分割線--------------------------------------

#include

#include

using

namespace std;

const

int size=

605;

int a[size]

;int dp[size]

[size]

;//dp[i][j] 從第i顆珠子到第j顆釋放能量的最大值

intmain()

}}//找出把前多少個珠子合併到最後的珠子是最優解

for(

int i=

1; i<=n; i++)if

(dp[i]

[i+n-1]

>ans)

ans=dp[i]

[i+n-1]

;//更新答案

printf

("%d"

,ans)

;return0;

}/*dp[j][p]=max(dp[j][p],dp[j][k]+dp[k+1][p]+a[j]*a[k+1]*a[p];

*/

洛谷 P1063 能量項鍊

然而在提高組的動歸里居然還有這樣一道水題。把環拆成鏈,然後愉快的區間動歸。列舉起始位置,列舉區間長度,列舉斷開位置,然後找最大的方案記錄下來。思路明了,十分簡單。includeusing namespace std int len,head 1001 tail 1001 f 1001 1001 n ...

能量項鍊 洛谷P1063

1154 能量項鍊 2006年noip全國聯賽提高組 時間限制 1 s 空間限制 128000 kb 題目等級 gold題解 題目描述description 在mars星球上,每個mars人都隨身佩帶著一串能量項鍊。在項鍊上有n顆能量珠。能量珠是一顆有頭標記與尾標記的珠子,這些標記對應著某個正整數。...

能量項鍊 洛谷P1063

2006年noip全國聯賽提高組 時間限制 1 s 空間限制 128000 kb 題目等級 gold 題解題目描述description 在mars星球上,每個mars人都隨身佩帶著一串能量項鍊。在項鍊上有n顆能量珠。能量珠是一顆有頭標記與尾標記的珠子,這些標記對應著某個正整數。並且,對於相鄰的兩顆...