環形區間DP 環形石子合併

2021-10-25 17:29:29 字數 1107 閱讀 2402

在乙個園形操場的四周擺放n堆石子,現要將石子有次序地合併成一堆.規定每次只能選相鄰的2堆合併成新的一堆,並將新的一堆的石子數,記為該次合併的得分。

試設計出1個演算法,計算出將n堆石子合併成1堆的最小得分和最大得分.

輸入輸出格式

輸入格式:

資料的第1行試正整數n,1≤n≤100,表示有n堆石子.第2行有n個數,分別表示每堆石子的個數.

輸出格式:

輸出共2行,第1行為最小得分,第2行為最大得分.

輸入輸出樣例

輸入樣例#1:

44 5 9 4

輸出樣例#1:

4354

相比於單邊的區間合併問題 此問題將區間構成了乙個環 也就是我們需要在環上面合併

但是 此問題也能轉化為單邊區間dp問題

關鍵:上面有n個資料 但是我們得擴充套件為2*n-1 這樣子既變成了單邊 也實現了環上dp

舉例 例如上面的資料 4 5 9 4 我們需要在這個環上區間合併求最值

我們可以擴充為 4 5 9 4 4 5 9 這樣子假設我區間選取(3,6) 是不是就實現了將4 x 9 4 這個反方向合併的區間最值求法了

#include

#include

using

namespace std;

const

int n =

500;

int f_min[n]

[n];

int f_max[n]

[n];

int s[n]

;int n;

intmain()

//一維字首和

for(

int i =

1;i <=

2*n-

1;i++

)//需要擴充到2*n-1個

for(

int len =

2;len <= n;len++)}

}int min =

1e8;

int max =

1e-8

;for

(int i =

1;i <= n;i++

) cout

}

環形石子合併(區間DP)

題目描述 將 n 堆石子繞圓形操場排放,現要將石子有序地合併成一堆。規定每次只能選相鄰的兩堆合併成新的一堆,並將新的一堆的石子數記做該次合併的得分。請編寫乙個程式,讀入堆數 n 及每堆的石子數,並進行如下計算 選擇一種合併石子的方案,使得做 n 1 次合併得分總和最大。選擇一種合併石子的方案,使得做...

環形區間DP

區間dp的一般思考方式是 先列舉長度,再列舉開頭和結尾,再列舉中間的分割點 環形區間dp一般是把環展開成鏈後複製成兩倍,再做線性的區間dp 1068.環形石子合併 將 n 堆石子繞圓形操場排放,現要將石子有序地合併成一堆。規定每次只能選相鄰的兩堆合併成新的一堆,並將新的一堆的石子數記做該次合併的得分...

環形石子合併問題

環形石子合併問題是在普通的相鄰石子合併問題的基礎上稍加拓展,石子變成了環形的,也就是說每個石子都可能和其左右兩邊的石子合併。那麼它的dp解法也是基於普通的相鄰石子合併問題,不了解的同學可以參考我寫過的這篇文章。有兩種解法,但他們基本的演算法思想是一樣的。第一種是和上面鏈結文章的寫法類似,不同的是對於...