一道huffman樹問題,貪心在每一次合併堆的時候,都取最小的兩個堆合併。
用乙個優先佇列(小頂堆)來存下所有堆的資料,每次取前面兩個合併就可以了。
acwing282. 石子合併
設有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
輸入樣例:
41 3 5 2
輸出樣例:
題目一模一樣,但是這道題的資料大小沒有現在做的大,這裡n=300,而上面一題n=1e5,所以dp不能做。
#include
#include
#include
;#include
using
namespace std;
intmain()
int res=0;
while
(heap.
size()
>1)
cout << res;
}
Acwing148 合併果子(哈夫曼問題 小根堆)
原題鏈結 在乙個果園裡,達達已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。達達決定把所有的果子合成一堆。每一次合併,達達可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過n 1次合併之後,就只剩下一堆了。達達在合併果子時總共消耗的體力等於每次合併所耗...
合併果子(multiset)
time limit 1 sec memory limit 128 mb submit 312 solved 113 submit status web board 現在有n堆果子,第i堆有ai個果子。現在要把這些果子合併成一堆,每次合併的代價是兩堆果子的總果子數。求合併所有果子的最小代價。第一行包...
swustoj合併果子
在乙個果園裡,多多已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。多多決定把所有的果子合成一堆。每一次合併,多多可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過n 1次合併之後,就只剩下一堆了。多多在合併果子時總共消耗的體力等於每次合併所耗體力之和。...