洛谷1880 NOI1995 石子合併

2021-08-20 22:44:37 字數 837 閱讀 7986

題目:石子合併

思路:斷環為鏈。

sum[i]為原序列的字首和。

令f[i,j]為一段以i為起點長度為j的石子合併需要的最小代價。

轉移方程:

f[i][j]=min(f[i][j],f[i][k-i+1]+f[k+1][ed-k]+sum[ed]-sum[i-1]);
其中,k為劃分點,ed為這一段石子的末位置,即i+j-1。

主要的思想差不多就是列舉乙個點把當前這段石子分為兩部分,這一段的最小代價就是每次劃分後的兩段代價之和加上合併需要的代價的最小值。

最大值g(i,j)同理可求。

f,g可在同一函式中求得。

**:

#includeusing namespace std;

#define maxn 200

#define inf (1<<29)

int n;

int a[maxn+5]= ,sum[maxn+5]= ; //原資料,字首和

int f[maxn+5][maxn+5]= ,g[maxn+5][maxn+5]= ; //f(i,j)以i為起點長度為j的狀態的最小代價,g同理為最大代價

int fcmp(const int& a1,const int& a2,const int& opr)

int dp(int ff[maxn+5][maxn+5],int cmp)

} }int s=inf-cmp*inf;

for(int i=1;i<=n/2;i++) s=fcmp(s,ff[i][n/2],cmp);

return s;

}int main()

洛谷 1880 NOI1995 石子合併

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

洛谷 P1880 NOI1995 石子合併

這道題是之前石子合併的加強板 不同在於是乙個環 處理方法就是把陣列 乘以2,列舉起點轉化成鏈。以後這種環的問題應該都可以這樣來轉化。陣列空間不要忘了乘以2 然後要注意區間從長度為2開始,初始化為最大或最小 注意這裡的得分是合併之後的得分,所以單獨一堆是沒有得分的。include include in...

洛谷 P1880 NOI1995 石子合併

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