合併石子(區間dp 模板題)

2021-09-26 12:41:29 字數 1078 閱讀 9189

設有n堆沙子排成一排,其編號為1,2,3,…,n(n< =300)。每堆沙子有一定的數量,可以用乙個整數來描述,現在要將這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

合併的最小代價

4

1 3 5 2

22
思路:區間dp的模板題,組合每兩堆,有點二分思想,將區間不斷縮小,然後得到最小的值。

狀態轉移方程:

fmin = min //得出所在區間的最小值。

fmin += sum[r] – sum[l - 1] //既然這兩個區間可以合併,則中間的部分一定合併完成。

這題可以用dfs遞迴,也可以用for迴圈。

#include

#include

#include

#include

#include

using

namespace std;

const

int maxn =

305;

int dp[maxn]

[maxn]

, sum[maxn]

, n;

//dp是記憶陣列,sum是和陣列

intdfs

(int l,

int r)

intmain()

printf

("%d\n"

,dfs(1

, n));

return0;

}

合併石子 區間dp水題

合併石子 描述 有n堆石子排成一排,每堆石子有一定的數量。現要將n堆石子並成為一堆。合併的過程只能每次將相鄰的兩堆石子堆成一堆,每次合併花費的代價為這兩堆石子的和,經過n 1次合併後成為一堆。求出總的代價最小值。tags 最基本的區間dp,這題範圍小,如果n大一些,還是要加個平行四邊行優化。incl...

合併石子 (區間覆蓋DP)

任重而道遠 在乙個操場上一排地擺放著 堆石子。現要將石子有次序地合併成一堆。規定每次只能選相鄰的 堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的得分。計算出將 堆石子合併成一堆的最小得分。第一行為乙個正整數n 2 100 以下 行,每行乙個正整數,小於10000,分別表示第i堆石子的個數 1...

石子合併(區間DP模板)

設有n堆石子排成一排,其編號為1,2,3,n。每堆石子有一定的質量,可以用乙個整數來描述,現在要將這n堆石子合併成為一堆。每次只能合併相鄰的兩堆,合併的代價為這兩堆石子的質量之和,合併後與這兩堆石子相鄰的石子將和新堆相鄰,合併時由於選擇的順序不同,合併的總代價也不相同。例如有4堆石子分別為 1 3 ...