洛谷P1880 石子合併

2021-07-16 15:38:13 字數 1442 閱讀 5409

描述

在乙個園形操場的四周擺放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個數,分別...