題目描述
在乙個圓形操場的四周擺放 n 堆石子,現要將石子有次序地合併成一堆.規定每次只能選相鄰的2堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。
試設計出乙個演算法,計算出將 n 堆石子合併成 1 堆的最小得分和最大得分。
輸入格式
資料的第 1 行是正整數 n,表示有 n 堆石子。
第 2 行有 n 個整數,第 i 個整數 ai
表示第 i 堆石子的個數。
輸出格式
輸出共 2 行,第 1 行為最小得分,第 2 行為最大得分。
輸入
445
94
輸出
43
54
加上環怎麼辦?
斷環為鏈:將長度為n的鏈複製乙份接在後面,環的情況就是長度為2n的鏈中任意連續的長度為n的鏈。
**如下:
#include
using namespace std;
int f[
210]
[210];
int ff[
210]
[210];
int v[
210]
[210];
int a[
220]
;int n;
intmain()
for(
int i=
1;i<=n*
2;i++)}
for(
int i=
1;i<=n*
2;i++)}
}for
(int len=
1;len<=n;len++
)for
(int l=
1,r=l+len;l2&&r2;l++
,r=l+len)
}int ans1=
10000000
,ans2=0;
for(
int i=
1;i<=n;i++
) ans1=
min(ans1,f[i]
[i+n-1]
);for(
int i=
1;i<=n;i++
) ans2=
max(ans2,ff[i]
[i+n-1]
);cout
}
石子合併(區間型動規)
在乙個圓形操場的四周擺放n堆石子 n 500 現要將石子有次序地合併成一堆。規定每次只能選相鄰的兩堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。編一程式,由檔案讀入堆數n及每堆的石子數 選擇一種合併石子的方案,使得做n 1次合併,得分的總和最小 選擇一種合併石子的方案,使得做n 1次合...
區間動規經典題 石子合併
在乙個園形操場的四周擺放n堆石子,現要將石子有次序地合併成一堆.規定每次只能選相鄰的2堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分 試設計出1個演算法,計算出將n堆石子合併成1堆的最小得分和最大得分 資料的第1行試正整數n,1 n 100,表示有n堆石子.第2行有n個數,分別表示每堆石...
區間動規經典題 石子合併
在乙個園形操場的四周擺放n堆石子,現要將石子有次序地合併成一堆.規定每次只能選相鄰的2堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分 試設計出1個演算法,計算出將n堆石子合併成1堆的最小得分和最大得分 資料的第1行試正整數n,1 n 100,表示有n堆石子.第2行有n個數,分別表示每堆石...