動規之 環形石子合併

2021-10-06 11:14:16 字數 1220 閱讀 7851

題目描述

在乙個圓形操場的四周擺放 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個數,分別表示每堆石...