在乙個園形操場的四周擺放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解法也是基於普通的相鄰石子合併問題,不了解的同學可以參考我寫過的這篇文章。有兩種解法,但他們基本的演算法思想是一樣的。第一種是和上面鏈結文章的寫法類似,不同的是對於...