經典區間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顆能量珠。能量珠是一顆有頭標記與尾標記的珠子,這些標記對應著某個正整數。並且,對於相鄰的兩顆...