環形石子合併問題(動態規劃)(洛谷P1880)

2021-08-18 22:32:35 字數 1016 閱讀 1875

環形石子合併問題(動態規劃)

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

}

環形石子合併問題為洛谷p1880

在乙個圓形操場的四周擺放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

題解:對於環形的處理典型的方法是將環拆成鏈,也就是將長度擴大2倍,求鏈的最佳得分可以通過反向列舉左端點,然後找到當前到右端點的最佳,因為鏈的長度為原來的兩倍,所以應該從2*n-1列舉,每次列舉n的長度,然後從1-n找最後的答案即可。

ac**:

#include #include using namespace std;

#define _for(i,a,b) for(int i=a;i<=b;i++)

const int maxn = 507;

const int inf = 0x3f3f3f;

int n,m,a[maxn],sum[maxn],dp_max[maxn][maxn],dp_min[maxn][maxn];

int main(int argc, char const *argv)

_for(i,n+1,n*2)

for(int i=n*2-1;i>0;i--)}}

int ans_min = inf;

int ans_max = 0;

_for(i,1,n)

cout

}

石子合併 動態規劃(環形)

1 問題描述 問題 nwpu noj 1148 在乙個圓形操場的四周擺放著n堆石子 n 100 現要將石子有次序地合併成一堆。規定每次只能選取相鄰的兩堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。編一程式,讀入石子堆數n及每堆的石子數 20 選擇一種合併石子的方案,使得做n 1次合併,...

合併類動態規劃 石子合併(洛谷1880)

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

洛谷 P1880 石子合併 環形

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