分離與合體 DP DFS

2021-10-08 07:14:37 字數 2287 閱讀 2667

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

杜神牛造了個區域,它們緊鄰著排成了一行,編號1-n。在這經個區域裡都放著一把oi界

的密鑰匙,每一把都有一定的價值,lyd當然想得到它們了。然而杜神牛規定lyd不可以一下子

把它們全部拿走,而是每次只可以拿一把。為了盡快地拿到所有的密鑰匙,lyd自然就用上了剛學的分離與合體特技。

開始lyd可以選擇從1~n-1的任何乙個區域(記為k)進入,進入後lyd會在k區域發

生分離,從而分離為兩個小lyd。分離完成的同時會有一面牆在k和k+1區域之間公升起,從而把

的區間內任選除了區間末尾區域以外(即1~k-1或k+1~n-1)的任何乙個區域再次發生分離

就一共有了4個小小lyd…重複進行以上所敘述的分離,直到每個小lyd發現自己所在的區間只剩下了乙個區域,他們就可以抱起自己夢寐以求的oi密鑰匙。

但是lyd不能就這麼分成n多個個體存在於世界上,這些小lyd還會再合體,合體的兩個小

lyd所在的區間中間的牆會消失。合體會獲得一定的價值,計算方法是:(合併後所在區間的左右

端區域裡密鑰匙的價值之和)乘(之前分離的時候所在區域的密鑰匙價值)

例如,lyd曾經在1~3區間中的2號區域分離成為1~2和3兩個區間,合併時獲得的價值就

是:(1號密鑰匙價值+3號價值)*(2號密鑰匙價值)

lyd請你程式設計求出最終可以獲得的總價值最大是多少。並按照分離階段從前到後,區域從左

向右的順序,輸出發生分離的區域編號

例如,先列印1分為2的分離區域,然後從左到右列印2分為4的分離區域,然後是4分為

的注意:若有多種方案,選擇分離區域盡量靠左的方案(也可以理解為輸出字典序最小的)

第一行乙個正整數n(2≤n≤300)

第二行為n個用空格分開的正整數,表示1~n區域裡每把密鑰匙的價值。

保證運算過程及結果不超出int範圍

第一行的乙個數,即獲得的最大價值。。

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

712

3456

7

23812

3456

因為合體價值 =(1號密鑰匙價值+3號價值)*(2號密鑰匙價值)所以說不難得到狀態轉移方程,簡直就是模板

dp[i]

[j]=

min(dp[i]

[j],dp[i]

[k]+ dp[k +1]

[j]+

(a[i]

+ a[j]

)* a[k]

)(其中dp[i]

[j]表示從區間[i,j]中能獲得的最大價值)

(k為劃分區間的斷點,合併石子般的模板)

(目標:dp[1]

[n])

第乙個問求最大值算出來很簡單,但第二個問求序列…(做到崩潰)

難點就是第二個求序列,求序列我們可以用乙個類似迭代加深的玄學玩意兒來解決。

先用乙個二維陣列road[i][j]來儲存關於區間[i,j]的斷點,也就是每一次擋板的房間,當dp[i][j]被更新時,road[i][j]也會改變,假如dp[i][j]變為了dp[i][k] + dp[k + 1][j] + (a[i] + a[j]) * a[k]那麼road[i][j]也會改變為k。

然後再用乙個搜尋來求出路徑。之後的搜尋就變得簡單了…

#include

#include

#include

using

namespace std;

const

int maxn =

1e3+5;

int a[maxn]

,dp[maxn]

[maxn]

,road[maxn]

[maxn]

,n,p;

int f =1;

void

dfs(

int x,

int y,

int cnt)

dfs(x,road[x]

[y],cnt +1)

;dfs

(road[x]

[y]+

1,y,cnt +1)

;}intmain()

}}}printf

("%d\n"

,dp[1]

[n])

;while

(f)return0;

}

分離與合體題解 區間DP DFS

題目描述 經過在機房裡數日的切磋,lyd 從杜神牛那裡學會了分離與合體,出關前,杜神牛給了他乙個測試 杜神牛造了n 個區域,他們緊鄰著排成一行,編號 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 當然想得到...