分離與合體題解 區間DP DFS

2022-06-04 03:12:08 字數 2542 閱讀 3336

題目描述

經過在機房裡數日的切磋,lyd 從杜神牛那裡學會了分離與合體,出關前,杜神牛給了他乙個測試……

杜神牛造了n 個區域,他們緊鄰著排成一行,編號 1 ~ n 。在每個區域裡都放著一把 oi 界的密鑰匙,每一把都有一定的價值,lyd 當然想得到他們了。然而杜神牛規定 lyd 不能一下子把他們全部拿走,而是每次只可以拿一把。為了盡快得到所有密鑰匙,lyd 自然就用上了剛學的分離與合體特技。

一開始 lyd 可以選擇 1 … n - 1 中的任何乙個區域進入,我們不妨把這個區域記為k 。進入後 lyd 會在 區域發生分離,從而分離成兩個小 lyd。分離完成的同時會有一面牆在 k 區域和 k + 1 區域間公升起,從而把1…k 和 k + 1 … n 阻斷成兩個獨立的區間,並在各自區間內任選除區間末尾之外(即從 1…k-1 和 k+1…n-1中選取)的任意乙個區域再次發生分離,這樣就有了四個小小 lyd……重複以上所敘述的分離,直到每個小 lyd 發現自己所在的區間只剩下了乙個區域,那麼他們就可以抱起自己夢寐以求的 oi 密鑰匙。

但是 lyd 不能就分成這麼多個個體存在於世界上,這些小 lyd 還會再合體,合體的小 lyd 所在區間中間的牆會消失。合體會獲得 合併後所在區間左右端區域裡密鑰匙價值之和之前分離的時候所在區域的密鑰匙價值。

lyd 請你程式設計求出最終可以獲得的最大總價值,並按照分離階段從前到後,區域從左到右的順序,輸出發生分離區域編號。若有多種方案,選擇分離區域盡量靠左的方案(也可以理解為輸出字典序最小的)。

例如先列印一分為二的區域,然後從左到右列印二分為四的分離區域,然後是四分為八的……

輸入格式

第一行乙個正整數n 第二行 n 個用空格分開的正整數 aia

i​,表示 區域裡每把密鑰匙的價值。

輸出格式

第一行乙個數,表示獲得的最大價值

第二行按照分離階段從前到後,區域從左到右的順序,輸出發生分離區域編號。若有多種方案,選擇分離區域盡量靠左的方案(也可以理解為輸出字典序最小的)。

樣例樣例輸入

71 2 3 4 5 6 7

樣例輸出

2381 2 3 4 5 6

資料範圍與提示

對於100% 的資料,nin

i​,ai

ai​保證運算過程和結果不超過 int

int 位正整數範圍。

首先,求出獲得的最大價值可以直接通過區間dp得到,只是將合併石子的條件做了改動。

可以設dp[

i,j]

dp[i

,j]是從第i

i個區域到第j

j個區域之間獲得的最大價值。

狀態轉移方程為:dp

[i,j

]=dp

[i,k

]+dp

[k+1

,j]+

a[i]

∗a[k

]∗a[

j]dp

[i,j

]=dp

[i,k

]+dp

[k+1

,j]+

a[i]

∗a[k

]∗a[

j](1

<=i

<=n

−len

+1,j

=i+l

en−1

,i<=k

(1<=i

<=n

−len

+1,j

=i+l

en−1

,i<=k

for

(int len =

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

}}printf

("%d\n"

, dp[1]

[n])

;

重點在於如何輸出路徑。

注意讀題:

求出最終可以獲得的最大總價值,並按照分離階段從前到後,區域從左到右的順序,輸出發生分離區域編號。若有多種方案,選擇分離區域盡量靠左的方案(也可以理解為輸出字典序最小的)。例如先列印一分為二的區域,然後從左到右列印二分為四的分離區域,然後是四分為八的……結果考試的時候以為要從左往右輸出,於是所有的輸出都是從1~n-1… 又因為一些bug導致基本沒得分。。。

輸出可以用dfs,從最後乙個劃分點往回找。

定義dfs(

x,y,

end)

dfs(

x,y,

end)

,xx表示左邊界,y

y表示右邊界,end

end 表示劃分次數。

要配合使用乙個whi

lewh

ile迴圈,原理如下

1.定義乙個h

h表示輸出的序號,每輪迴圈+1,與dfs

dfs中的end

end配合,保證輸出的順序不亂,將h

h初始化為0,fla

gfla

g置為1.

2.進入迴圈

dfs(x, pre[x]

[y], end +1)

;dfs

(pre[x]

[y]+

1, y, end +1)

;}flag =1;

while

(flag)

分離與合體 DP DFS

經過在機房裡數日的切磁,lyd從社神牛那裡學會了分離與合體,出關前,杜神牛給了他乙個測試 杜神牛造了個區域,它們緊鄰著排成了一行,編號1 n。在這經個區域裡都放著一把oi界 的密鑰匙,每一把都有一定的價值,lyd當然想得到它們了。然而杜神牛規定lyd不可以一下子 把它們全部拿走,而是每次只可以拿一把...

題解 分離與合體 Loj10151

傳送門 分離與合體 loj10151 給定乙個長度為 n 的序列,如果從某個點 k 處將區間 l,r 斷開,劃分為 l,k 和 k 1,r 可以得到 a k a l a r 的分數,要求最後要把區間劃分到無法再分為止 即長度全為 1 並按照分離時間從前到後,區間從左到右的順序輸出所有劃分點 k 樣例...

一本通1573分離與合體

時間限制 1000 ms 記憶體限制 524288 kb 題目描述 經過在機房裡數日的切磋,lyd 從杜神牛那裡學會了分離與合體,出關前,杜神牛給了他乙個測試 杜神牛造了 n 個區域,他們緊鄰著排成一行,編號 1.n。在每個區域裡都放著一把 oi 界的密鑰匙,每一把都有一定的價值,lyd 當然想得到...