codevs1154能量項鍊 環形區間DP 細節

2022-05-13 16:31:33 字數 1723 閱讀 2732

中文題。。題意略

我們知道每次列舉最後合併哪兩個。。

於是列舉中間節點k

我犯的錯誤是將轉移方程寫成了,dp[l][r]=max(dp[l][r],dp[l][k]+dp[k+1][r]+a[l]*a[k+1]*a[k+2])

然而我們知道,dp[l][k]的頭和尾是(l,k+1),dp[k+1][r]的頭和尾是(k+1,r+1)

我居然沒分析出這一點。。困惑於如果[1,4]分成的乙個子區間[2,3],dp[2][3]=dp[2][2]+dp[3][3]+a[2]*a[3]*?

這裡看成最後一次合併。。你是a[2]*a[3]*a[2]呢,還是a[2]*a[3]*a[3]*a[3+1]=(由題意)a[2]*a[3]*a[3+1],如果我們按照題意頭尾分析

我在糾結把2,3看成遞迴地最後一次合併應該怎麼看待,如果按我的理解一開始按位置來最後倆合併的是2,3那麼這倆相鄰。。所以一定是互相乘

但是實際上根本不存在2,3最後一次合併。。

那麼問題就變成了最後剩下兩個就一定該互相乘嗎?按照題意來說不是的

比如說1,2,3,4,5,1,2,3,4,5

如果按照整個區間來算比如 (3,4,5) (1,2)則這個演算法總是有效

但是(2,3,4)

(2,2) (3,4)

顯然在小區間。。我們任何時候都應該考慮往右擴充套件,此時a[2]*a[3]*a[2]是不對的。。因為(3,4)這一部分合併完字尾一定是5

那麼會不會有一種情況導致5這個珠子已經沒了呢。。不會的。。因為我們在劃分的時候,你看一下上面的序列就明白

要麼1,5被隔開。。要麼按5,1的順序連在一起。。合併完字首不還是5..所以這種情況字尾一定存在。。不必擔心。。

所以給我們的啟示是。。按照題目的規則合併。。因為我們在小子區間的臆想不符合題意。。要按照頭尾標號進行合併計算

然後處理環形我們都開大一倍空間。。然後我們取i,i+(n-1)區間中最大的情況就好了,

但是n<=100,我才開了105,多開一倍空間的話就是201!奇葩oj給我報了wa而不是re,真是nb。。以後一定要小心環忘記開大陣列而wa

然而後來我注意到乙個顯然的事實。。在小區間裡發生的一定不是整個區間的最後一次合併。。並且合併計算的條件不是遞迴的。。而是整體靜態的

貼18ms的**。。

#include #include 

#include

#include

using

namespace

std;

intn;

int a[255

];int dp[255][255

];int dfs(int l,int r,int

dep)

p=max(p,a[l]*a[r]*a[r+1]+dfs(l,r-1,dep+1

));

//printf("dfs (%d,%d) dep%d ans%d\n",l,r,dep,p);

return dp[l][r]=p;

}int

main()

for(i=n+1;i<=2*n;++i)

int ans=0

; memset(dp,-1,sizeof

(dp));

dfs(

1,2*n-1,0

);

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

printf(

"%d\n

",ans);

return0;

}

codevs 1154 能量項鍊

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

codevs 1154 能量項鍊

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

codevs 1154 能量項鍊

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