傳送門:分離與合體 \([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 當然想得到...