problem description
在乙個圓形操場的四周擺放著n堆石子。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2 堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的得分。試設計乙個演算法,計算出將n堆石子合併成一堆的最小得分和最大得分。
對於給定n堆石子,計算合併成一堆的最小得分和最大得分。
input
輸入資料的第1行是正整數n,1≤n≤100,表示有n堆石子。第二行有n個數,分別表示每堆石子的個數。
output
輸出資料有兩行,第1行中的數是最小得分,第2行中的數是最大得分。
sample input
44 4 5 9
sample output
4354
hint
source
#include
#include
#include
#define n 101
#define m 100000000
using
namespace std;
int n, a[n]
, sum[n*2]
, f[n*2]
[n*2];
intmin
(int x,
int y)
intmax
(int x,
int y)
intmain()
for(i = n+
1; i <= n+n; i++
) sum[i]
= sum[i-1]
+ a[i-n]
;memset
(f,0
,sizeof
(f))
;for
(k =
1; k <= n; k++
)for
(i =
1; i+k <= n+n; i++
) ans = m;
for(i =
1; i <= n; i++
) ans =
min(ans, f[i]
[i+n-1]
);printf
("%d\n"
, ans)
;memset
(f,0
,sizeof
(f))
;for
(k =
1; k <= n; k++
)for
(i =
1; i+k <= n+n; i++
) ans =0;
for(i =
1; i <= n; i++
) ans =
max(ans, f[i]
[i+n-1]
);printf
("%d\n"
, ans)
;return0;
}
石子合併問題
在乙個圓形操場的四周擺放著n堆石子。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的得分。試設計乙個演算法,計算出將n堆石子合併成一堆的最小得分和最大得分。分析 假設有n堆石子需要合併,可以設計乙個2 n 1個元素的陣列來儲存每堆石子的個數。...
石子合併問題
在乙個圓形操場的四周擺放著n堆石子。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的得分。試設計乙個演算法,計算出將n堆石子合併成一堆的最小得分和最大得分。沒有用dp 感覺一般的也能寫,時間複雜度也不高。include include inc...
石子合併問題
石子合併問題是最經典的dp問題。首先它有如下3種題型 1 有n堆石子,現要將石子有序的合併成一堆,規定如下 每次只能移動任意的2堆石子合併,合併花費為新合成的一堆石子的數量。求將這n堆石子合併成一堆的總花費最小 或最大 分析 當然這種情況是最簡單的情況,合併的是任意兩堆,直接貪心即可,每次選擇最小的...