洛谷1880 石子合併

2021-08-02 23:58:06 字數 895 閱讀 6884

在乙個園形操場的四周擺放n堆石子,現要將石子有次序地合併成一堆.規定每次只能選相鄰的2堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。

試設計出1個演算法,計算出將n堆石子合併成1堆的最小得分和最大得分.

輸入格式:

資料的第1行試正整數n,1≤n≤100,表示有n堆石子.第2行有n個數,分別表示每堆石子的個數.

輸出格式:

輸出共2行,第1行為最小得分,第2行為最大得分.

輸入樣例#1:

4

4 5 9 4

輸出樣例#1:

43

54

系統的學習了學習區間dp,現做如下總結並寫了乙個裸題。

所謂區間dp,是通過對小區間的最優處理從而獲得對更大區間的最優解。

迴圈中,先列舉區間長度,再列舉起點,最後列舉乙個斷點。

本題思路:本題就是乙個區間dp,f[i][i+j]表示以i為起點,j個長度所能獲得的最大分數,列舉乙個斷點k,表示之前已經合併的是[i,k]和[k+1,i+j].另開乙個陣列g,記錄合併後的每乙個區間的石子個數。

#includeusing namespace std;

const int maxn=210;

int f[maxn][maxn],a[maxn],g[maxn][maxn],f1[maxn][maxn],g1[maxn][maxn];

int main()

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

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

for (int j=1;j<=n;j++)}}

} int ans1=1e9,ans2=-ans1;

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

cout<

洛谷1880 石子合併

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

洛谷 1880 石子合併

在乙個圓形操場的四周擺放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堆石子.第2行有n個數...