TYVJ 1055 沙子合併

2021-06-20 10:03:36 字數 867 閱讀 8246

設有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堆沙子分別為...