區間DP 洛谷P1880石子合併題解

2021-08-25 11:10:57 字數 674 閱讀 4825

典型的區間dp,我們可以建立狀態f[i][j]表示將區間[i,j]內的石子合併的最大值。那麼我們可以把[i,j]分為[i,k]和[k+1,j](i<=k那麼可以推出狀態轉移方程:

其中s陣列是表示字首和的,提前預處理了區間內的石子合併總分。

另外有乙個要注意的地方,如果直接從前往後列舉區間的左右端點,那麼因為k>=i,則會出現f[k+1][j]還未進行轉移的情況,會導致莫名其妙的錯誤,所以可以列舉右端點和區間長度,來計算左端點即可。

最後統計整個陣列的最小值時,要注意所需要的區間是[i,i+n-1]。

#include #define inf (int)1e9

using namespace std;

int a[210];

int s[210];

int f1[210][210], f2[210][210];

int main()

for (int i = n+1; i <= 2*n; ++i)

for(int p=1;p}}

int m1 = 0,m2 = inf;

for (int i = 1; i <= n; ++i)

cout << m2 << endl;

cout << m1 << endl;

return 0;

}

洛谷P1880 石子合併

描述 在乙個園形操場的四周擺放n堆石子,現要將石子有次序地合併成一堆.規定每次只能選相鄰的2堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。試設計出1個演算法,計算出將n堆石子合併成1堆的最小得分和最大得分.輸入格式 資料的第1行試正整數n,1 n 100,表示有n堆石子.第2行有n個數...

洛谷 P1880 石子合併

題目描述 在乙個園形操場的四周擺放n堆石子,現要將石子有次序地合併成一堆.規定每次只能選相鄰的2堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。試設計出1個演算法,計算出將n堆石子合併成1堆的最小得分和最大得分.輸入輸出格式 輸入格式 資料的第1行試正整數n,1 n 100,表示有n堆石...

洛谷 P1880 石子合併

一道區間 dp的典型題目。下面,我們先考慮不在環上,而在一條鏈上的情況。令狀態 f i,j 表示將下標在 i,j 區間的元素合併起來所能獲得的最大價值,則 f 1,n 就是問題的答案。狀態轉移式為 f i,j max quad k in i,j cost i,j,k 表示將區間 i,k 和 k 1,...