在乙個圓形操場的四周擺放n堆石子,現要將石子有次序地合併成一堆.規定每次只能選相鄰的2堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。
試設計出1個演算法,計算出將n堆石子合併成1堆的最小得分和最大得分.
輸入格式:
資料的第1行試正整數n,1≤n≤100,表示有n堆石子.第2行有n個數,分別表示每堆石子的個數.
輸出格式:
輸出共2行,第1行為最小得分,第2行為最大得分.
輸入
44 5 9 4
輸出43
54 思路
本題跟合併石子十分相似,不過它是圍成一圈的。本**採用的是樸素做法,具體就是把這些石子存到乙個一維陣列,再進行n次合併,每次都改變這堆石子的順序,就可以變成合併石子了。
動態轉移方程:
f[i][j]=max/min(f[i][j],f[i][k]+f[k+1][j]+s[j]-s[i-1]);
**(c++)
#include#include#define sr c=getchar()
#define input read()
#define pd (c<'0'||c>'9')
#define fk f=f*10+c-48
#define ps if (c=='-') d=-1
using namespace std;
int n;long long s[101];int dp1[101][101],dp2[101][101];int sl[101];//dp1是最大值,dp2是最小值
int maxp=0,minp=2147483647;//初始化
int max(int x,int y)//最大值
int min(int x,int y)//最小值
maxp=max(dp1[1][n],maxp);//最大值
minp=min(dp2[1][n],minp);//最小值
for (int i=1;i<=n;i++)
//改變石子的順序,也就是往後推,例如1,2,3變成2,3,1
} }int main()
SSL 1597 石子合併問題
description 在乙個圓形操場的四周擺放著n 堆石子。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2 堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的得分。試設計乙個演算法,計算出將n堆石子合併成一堆的最小得分和最大得分。程式設計任務 對於給定n堆石子,程式設計計算合併成一堆的最...
SSL P1597 石子合併問題
求在乙個圓圈中,合併所有石堆為一堆,其最大or最小的值。因為是在乙個圓圈內,所以一頭與一尾也可以合併,且合併一次,都要再模擬一次圓圈,十分麻煩,所以我用乙個2 n的陣列,將每個石堆的得分複製到其 n的位置上,然後我們就可以 為所欲為 像普通石子合併一樣,求出每段 i i n 的最大和最小值,最後再將...
SSL P1597 石子合併問題 題目
石子合併問題 time limit 1000ms memory limit 65536k total submit 172 accepted 75 description 在乙個圓形操場的四周擺放著n 堆石子。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2 堆石子合併成新的一堆,並將新的一堆石...