描述
在乙個園形操場的四周擺放n堆石子,現要將石子有次序地合併成一堆.規定每次只能選相鄰的2堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。
試設計出1個演算法,計算出將n堆石子合併成1堆的最小得分和最大得分.
輸入格式:
資料的第1行試正整數n,1≤n≤100,表示有n堆石子.第2行有n個數,分別表示每堆石子的個數.
輸出格式:
輸出共2行,第1行為最小得分,第2行為最大得分.
輸入樣例:
4
4 5 9 4
輸出樣例:
43
54
題解:很經典的問題了,然而我還是只會記憶化搜尋。。。 記得要有字首和優化。
#include
#include
#include
#include
#define inf 1e9
using
namespace std;
int s[
1004
],a[
1004
],n,f[
1004][
1004];
int ld;
intdp1
(int i,
int j)
intdp2
(int i,
int j)
intmain()
s[0]
=0;for
(int i=
1;i<=ld;i++
)s[i]
=s[i-1]
+a[i]
;int ans = inf;
for(
int i=
1;i<=
1000
;i++
)for
(int j=
1;j<=
1000
;j++
)f[i]
[j]=inf;
dp1(
1,ld)
;for
(int i=
1;i<=n;i++
) ans =
min(ans , f[i]
[i+n-1]
);printf
("%d\n"
,ans)
;memset
(f,-1,
sizeof
(f))
;dp2(1
,ld)
;for
(int i=
1;i<=n;i++
) ans =
max(ans , f[i]
[i+n-1]
);printf
("%d\n"
,ans)
;return0;
}
洛谷 P1880 石子合併
題目描述 在乙個園形操場的四周擺放n堆石子,現要將石子有次序地合併成一堆.規定每次只能選相鄰的2堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。試設計出1個演算法,計算出將n堆石子合併成1堆的最小得分和最大得分.輸入輸出格式 輸入格式 資料的第1行試正整數n,1 n 100,表示有n堆石...
洛谷 P1880 石子合併
一道區間 dp的典型題目。下面,我們先考慮不在環上,而在一條鏈上的情況。令狀態 f i,j 表示將下標在 i,j 區間的元素合併起來所能獲得的最大價值,則 f 1,n 就是問題的答案。狀態轉移式為 f i,j max quad k in i,j cost i,j,k 表示將區間 i,k 和 k 1,...
洛谷 P1880 石子合併 環形
在乙個圓形操場的四周擺放n堆石子,現要將石子有次序地合併成一堆.規定每次只能選相鄰的2堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。試設計出1個演算法,計算出將n堆石子合併成1堆的最小得分和最大得分.輸入格式 資料的第1行試正整數n,1 n 100,表示有n堆石子.第2行有n個數,分別...