SSL 1597石子合併問題(動規練習題)

2021-08-13 13:54:18 字數 1164 閱讀 3332

在乙個圓形操場的四周擺放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 堆石子合併成新的一堆,並將新的一堆石...