題面
garsiawachs演算法專門解決石子合併問題:
設乙個序列是a[0..n-1],每次尋找最小的乙個滿足a[k-1]<=a[k+1]的k,那麼我們就把a[k]與a[k-1]合併,並向前尋找乙個第乙個超過他們的和的數,把這個數插入到他後面;
#include#define inc(i,a,b) for(register int i=a;i<=b;i++)#define dec(i,a,b) for(register int i=a;i>=b;i--)
using namespace std;
long long ans,n;
vectorl;
int merge()
}register int tmp=l[k]+l[k+1];
l.erase(l.begin()+k);
l.erase(l.begin()+k);
register int in=-1;
dec(i,k-1,0)
}l.insert(l.begin()+in+1,tmp);
return tmp;
}int main()
inc(i,0,n-2) ans+=merge();
cout
}
BZOJ 3229 Sdoi2008 石子合併
時間限制 3 sec 記憶體限制 128 mb 提交 497 解決 240 提交 在乙個操場上擺放著一排n堆石子。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的得分。試設計乙個演算法,計算出將n堆石子合併成一堆的最小得分。第一行是乙個數n。...
282 石子合併
設有n堆石子排成一排,其編號為1,2,3,n。每堆石子有一定的質量,可以用乙個整數來描述,現在要將這n堆石子合併成為一堆。每次只能合併相鄰的兩堆,合併的代價為這兩堆石子的質量之和,合併後與這兩堆石子相鄰的石子將和新堆相鄰,合併時由於選擇的順序不同,合併的總代價也不相同。例如有4堆石子分別為 1 3 ...
2298 石子合併
2008年省隊選拔賽山東 時間限制 1 s 空間限制 256000 kb 題目等級 gold 在乙個操場上擺放著一排n堆石子。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的得分。試設計乙個演算法,計算出將n堆石子合併成一堆的最小得分。輸入描...