題解 分離與合體 Loj10151

2022-02-14 09:22:37 字數 1601 閱讀 5567

傳送門:分離與合體 \([loj10151]\)

給定乙個長度為 \(n\) 的序列,如果從某個點 \(k\) 處將區間 \([l,r]\) 斷開,劃分為 \([l,k]\) 和 \([k+1,r]\),可以得到 \(a[k]*(a[l]+a[r])\) 的分數,要求最後要把區間劃分到無法再分為止(即長度全為 \(1\)),並按照分離時間從前到後,區間從左到右的順序輸出所有劃分點 \(k\) 。

【樣例】

樣例輸入:

71 2 3 4 5 6 7

樣例輸出:

2381 2 3 4 5 6

【資料範圍】

\(20\%\)

\(n \leqslant 10\)

\(40\%\)

\(n \leqslant 50\)

\(100\%\)

\(n \leqslant 300\)

與經典區間 \(dp\) 題石子合併 \([noi1995]\)

\([p1880]\)

非常相似,用 \(dp[l][r]\) 表示將 \([l,r]\) 這段區間徹底劃分完所能獲得的最大分數。

通常區間 \(dp\) 有兩種大的方向:

\((1).\) 從小區間大區間轉移

\((2).\) 從大區間小區間轉移

這道題應採用 \((1)\) 更為合適。

按區間長度從小到大列舉所有區間 \([l,r]\),再列舉所有決策點 \(k \in[l,r-1]\),\(dp\) 方程為:

\(dp[l][r]=max\\)

那麼再來看這無比詭異的輸出。

區間最優決策點在 \(dp\) 的時候記錄一下就可以,輸出方式可以用佇列來進行模擬,和 \(bfs\) 的過程類似。

另外要注意這裡佇列的兩種寫法會造成空間消耗的不同,

\((1).\) 從隊首取出元素後判斷是否為合法區間(即長度大於 \(1\) 才輸出劃分點)

\((2).\) 在入隊前判斷,僅讓合法區間入隊。

第二種只會在佇列中加入 \(n-1\) 個合法區間(因為只會劃分 \(n-1\) 次),而第一種會比第二種多加入 \(n\) 個長度為 \(1\) 的不合法區間,因此佇列空間要開 \(2n\)。

時間複雜度為 \(o(n^3)\) 。

#include#define re register int

const int n=303;

struct qaqq[n];//空間要開夠

int n,h=1,t,tmp,a[n],g[n][n],dp[n][n];

inline void in(re &x)

int main()

printf("%d\n",dp[1][n]);

q[++t]=(qaq);

while(h<=t);/*寫法1*/

// q[++t]=(qaq);/*寫法1*/

if(lif(k+1}

}

分離與合體題解 區間DP DFS

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

分離與合體 DP DFS

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

一本通1573分離與合體

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