設有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
合併的最小代價
41 3 5 2
22
//動態方程f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+s[j]-s[i-1]);
#include#include#include#include#include#include#include#include#include#includeusing namespace std;
const int max=1010;
const int inf=1000000000;
int f[max][max];
int main()
for(int i=1;i<=n-1;i++)
f[i][i+1]=a[i]+a[i+1];
for(int p=2;p<=n-1;p++)//使得每次合併的區間不斷的由小變大
for(int i=1;i<=n-p;i++)
cout<
TYVJ P1055 沙子合併
沙子合併 描述 description 設有n堆沙子排成一排,其編號為1,2,3,n n 300 每堆沙子有一定的數量,可以用乙個整數來描述,現在要將這n堆沙子合併成為一堆,每次只能合併相鄰的兩堆,合併的代價為這兩堆沙子的數量之和,合併後與這兩堆沙子相鄰的沙子將和新堆相鄰,合併時由於選擇的順序不同,...
區間dp 合併沙子
設有n堆沙子排成一排,其編號為1,2,3,n n 300 每堆沙子有一定的數量,可以用乙個整數來描述,現在要將這n堆沙子合併成為一堆,每次只能合併相鄰的兩堆,合併的代價為這兩堆沙子的數量之和,合併後與這兩堆沙子相鄰的沙子將和新堆相鄰,合併時由於選擇的順序不同,合併的總代價也不相同,如有4堆沙子分別為...
洛谷 T8732 合併沙子
設有n堆沙子排成一排,其編號為1,2,3,n n 300 每堆沙子有一定的數量,可以用乙個整數來描述,現在要將這n堆沙子合併成為一堆,每次只能合併相鄰的兩堆,合併的代價為這兩堆沙子的數量之和,合併後與這兩堆沙子相鄰的沙子將和新堆相鄰,合併時由於選擇的順序不同,合併的總代價也不相同,如有4堆沙子分別為...