區間DP 動態規劃 C

2021-10-11 10:31:26 字數 1511 閱讀 3698

區間型別動態規劃是線性動態規劃的拓展,它在分階段劃分問題時,與階段中元素出現的順序和由前一階段的哪些元素合併而來有很大的關係。

1、合併:即將兩個或多個部分進行整合。

2、特徵:能將問題分解成為兩兩合併的形式。

3、求解:對整個問題設最優值,列舉合併點,將問題分解成為左右兩個部分,最後將左右兩個部分的最優值進行合併得到原問題的最優值。

acwing 282. 石子合併

設有n堆石子排成一排,其編號為1,2,3,…,n。

每堆石子有一定的質量,可以用乙個整數來描述,現在要將這n堆石子合併成為一堆。

每次只能合併相鄰的兩堆,合併的代價為這兩堆石子的質量之和,合併後與這兩堆石子相鄰的石子將和新堆相鄰,合併時由於選擇的順序不同,合併的總代價也不相同。

例如有4堆石子分別為 1 3 5 2, 我們可以先合併1、2堆,代價為4,得到4 5 2, 又合併 1,2堆,代價為9,得到9 2 ,再合併得到11,總代價為4+9+11=24;

如果第二步是先合併2,3堆,則代價為7,得到4 7,最後一次合併代價為11,總代價為4+7+11=22。

問題是:找出一種合理的方法,使總的代價最小,輸出最小代價。

輸入格式

第一行乙個數n表示石子的堆數n。

第二行n個數,表示每堆石子的質量(均不超過1000)。

輸出格式

輸出乙個整數,表示最小代價。

資料範圍

1≤n≤300

輸入樣例:

413

52

輸出樣例:

22
分析:要求n個石子歸併,我們根據dp的思想劃分成子問題,先求出每兩個合併的最小代價,然後每三個的最小代價,依次知道n個。

定義狀態f[i][j]為從第i個石子到第j個石子的合併最小代價。

那麼f[i][j] = min(f[i][k] + f[k+1][j])

那麼我們就可以從小到大依次列舉讓石子合併,直到所有的石子都合併。

這個問題可以用到平行四邊形優化,用乙個s[i][j]=k 表示區間 i—j 從k點分開才是最優的,這樣的話我們就可以優化掉一層複雜度,變為o(n2)

;//石子的重量兼字首和陣列

int f[n]

[n];

//f[i][j]表示:從第i堆石子到第j堆石子合併方案的代價的最小值

intmain()

printf

("%d\n"

, f[1]

[n])

;return0;

}

動態規劃之區間dp

動態規劃 dp 就是把把大問題轉化為乙個個小問題,然後在眾多的小問題中遞推得到這個大問題的最佳解 當然,這只是我個人對動態規劃的理解,希望有大牛來指導改正 那麼區間dp就是在區間之間進行動態規劃。那麼區間dp的典型例題就是 nyoj 15 括號配對 nyoj 737 石子合併 做區間dp的題的一般步...

模板 動態規劃 區間dp

因為昨天在codeforces上設計的區間dp錯了 錯過了上紫的機會 覺得很難受。看看學長好像也有學,就不用看別的神犇的了。區間dp處理環的時候可以把序列延長一倍。for int len 1 len n len 首先,使用四邊形優化要滿足下面的性質 當小區間包含在大區間中,則小區間的成本不高於大區間...

動態規劃 之 區間DP練習

loj 放上了那麼多 資訊學奧賽一本通 上的題 雖然我並沒有這本書 我要給它點乙個大大的贊 以後分類刷題不愁啦!那就一道道說吧。將 n 堆石子繞圓形操場排放,現要將石子有序地合併成一堆。規定每次只能選相鄰的兩堆合併成新的一堆,並將新的一堆的石子數記做該次合併的得分。求 n 1 次合併後得分總和的最大...