1597: [Usaco2008 Mar]土地購買
Time Limit: 10 Sec Memory Limit: 162 MB
Description
農夫John準備擴大他的農場,他正在考慮N (1 <= N <= 50,000) 塊長方形的土地. 每塊土地的長寬滿足(1 <= 寬 <= 1,000,000; 1 <= 長 <= 1,000,000). 每塊土地的價格是它的面積,但FJ可以同時購買多快土地. 這些土地的價格是它們最大的長乘以它們最大的寬, 但是土地的長寬不能交換. 如果FJ買一塊3x5的地和一塊5x3的地,則他需要付5x5=25. FJ希望買下所有的土地,但是他發現分組來買這些土地可以節省經費. 他需要你幫助他找到最小的經費.
Input
第1行: 一個數: N
第2..N+1行: 第i+1行包含兩個數,分別爲第i塊土地的長和寬
Output
- 第一行: 最小的可行費用.
Sample Input
4
100 1
15 15
20 5
1 100
輸入解釋:
共有4塊土地.
Sample Output
500
HINT
FJ分3組買這些土地: 第一組:100x1, 第二組1x100, 第三組20x5 和 15x15 plot. 每組的價格分別爲100,100,300, 總共500.
Source
Gold
分析
這題還是挺有意思的。
首先,這一題涉及分組和max有關的運算,這提示我們可以試試排序後進行劃分dp。
那麼我們將所有的矩形按長遞增進行排序。
然後我們發現,對於2個矩形x和y,如果x的長小於等於y的長,且x的寬小於等於y的寬。
那麼如果將x和y分在一組,那麼購買x肯定是不需要花費額外代價的(x會被其他的矩形完全包含)。
那麼我們就可以將x這個矩形扔掉。
因此我們可以在排序(時間複雜度O(nlog n))之後,我們就可以剔除掉所有沒有用的矩形。顯然剔除掉所有沒有用的矩形後,矩形數組中長是遞增的,寬是遞減的。因此我們可以利用一個單調棧完成剔除操作,時間複雜度O(n)。
進行了這些預處理後,數組具有了單調性,我們也就可以順利寫出dp方程了
記f[i]爲前i個矩形的最小代價,a[i]爲第i個矩形的長,b[i]爲第i個矩形的寬,那麼
f[i]=min{f[j-1]+a[i]*b[j]}
接着就是對方程式變形,最終得到
(f[j-1]-f[k-1])/(b[j]-b[k])>-a[i]時 k優於j
那麼就可以使用斜率優化了
算法的總時間複雜度爲O(nlog n),空間複雜度爲O(n)