設有n堆石子排成一排,其編號為1,2,3,…,n。
每堆石子有一定的質量,可以用乙個整數來描述,現在要將這n堆石子合併成為一堆。
每次只能合併相鄰的兩堆,合併的代價為這兩堆石子的質量之和,合併後與這兩堆石子相鄰的石子將和新堆相鄰,合併時由於選擇的順序不同,合併的總代價也不相同。
例如有4堆石子分別為 1 3 5 2, 我們可以先合併1、2堆,代價為4,得到4 5 2, 又合併 1,2堆,代價為9,得到9 2 ,再合併得到11,總代價為4+9+11=24;
如果第二步是先合併2,3堆,則代價為7,得到4 7,最後一次合併代價為11,總代價為4+7+11=22。
問題是:找出一種合理的方法,使總的代價最小,輸出最小代價。
第一行乙個數n表示石子的堆數n。
第二行n個數,表示每堆石子的質量(均不超過1000)。
輸出乙個整數,表示最小代價。
1≤n≤300
4
1 3 5 2
22
這道題是區間dp的板子題,主要就是去列舉區間
對於這個題我們直接列舉區間長度,然後再列舉區間的起點,這樣終點也有了,然後我們再列舉當前區間中的兩個子區間,然後計算合併的代價
ac**如下:
#includeusing namespace std;
const int maxn=3e2+10;
const int inf=0x3f3f3f3f;
int a[maxn],dp[maxn][maxn];
int main()
for(int len=1; len<=n; len++)
} }cout
}
ACWing 282 石子合併
n nn堆石子排成一排,編號為1 n 1 sim n 1 n。每堆石子的個數由乙個非負整數陣列a aa描述。現在要將這些石子合併為1 11堆,每次可以合併兩堆石子,所消耗的能量是這兩堆石子的總數。問合併為1 11堆為止所消耗的能量的最小值。輸入格式 第一行乙個數n nn表示石子的堆數n nn。第二行...
ACwing 282 石子合併(區間dp
給出n堆石子,每次只能合併相鄰的兩堆石子,代價為兩堆石子的質量和,求合併所有石子的最小代價。區間dp中i,j表示的是兩個區間的左右端點,操作物件是區間。dp i j 表示合併第i堆石子到第j堆石子的最小代價。對於i,j圍成的區間,以合併的分割線區分不同合併方式,相當於在i,j中插入一塊隔板,dp i...
ACwing 282 石子合併(區間DP)
設有n堆石子排成一排,其編號為1,2,3,n。每堆石子有一定的質量,可以用乙個整數來描述,現在要將這n堆石子合併成為一堆。每次只能合併相鄰的兩堆,合併的代價為這兩堆石子的質量之和,合併後與這兩堆石子相鄰的石子將和新堆相鄰,合併時由於選擇的順序不同,合併的總代價也不相同。例如有4堆石子分別為 1 3 ...