問題 K 石子合併I

2021-09-26 08:27:17 字數 924 閱讀 5119

題目描述

設有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
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define inf 0x3f3f3f3f

typedef long long ll;

using namespace std;

int dp[1001][1001],s[1001],n,sum[1001];

int main()

for (int i=1; idp[i][i+1]=s[i]+s[i+1];

for (int k=2; k}

cout

}

石子合併問題

在乙個圓形操場的四周擺放著n堆石子。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的得分。試設計乙個演算法,計算出將n堆石子合併成一堆的最小得分和最大得分。分析 假設有n堆石子需要合併,可以設計乙個2 n 1個元素的陣列來儲存每堆石子的個數。...

石子合併問題

在乙個圓形操場的四周擺放著n堆石子。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的得分。試設計乙個演算法,計算出將n堆石子合併成一堆的最小得分和最大得分。沒有用dp 感覺一般的也能寫,時間複雜度也不高。include include inc...

石子合併問題

石子合併問題是最經典的dp問題。首先它有如下3種題型 1 有n堆石子,現要將石子有序的合併成一堆,規定如下 每次只能移動任意的2堆石子合併,合併花費為新合成的一堆石子的數量。求將這n堆石子合併成一堆的總花費最小 或最大 分析 當然這種情況是最簡單的情況,合併的是任意兩堆,直接貪心即可,每次選擇最小的...