description:
地主想買一些長方形的土地,所有的土地可以分為若干組,每一組的土地的**為這一組裡的最長的長乘上最長的寬。土地的長和寬是不能交換的,例如一塊2*5的土地和一塊5*2的土地放在一起,**為5*5=25。最少花費多少錢可以買下所有的土地。
input:
第一行乙個數n表示一共有n塊土地。
接下來n行每行兩個數xi和yi分別表示每塊土地的長和寬。
output:
一行乙個數表示最小**。
把每塊地的乙個頂點對齊座標系原點,易知對於我們要考慮的每個點,都有(xi>xj || yi>yj) 如圖
dp[i]表示前i塊地最小**;
可得dp方程 dp[n]=min(dp[j]+x[j+1]*y[n])j可以推出,如果用k更新n比用j更新更優,有dp[k]-dp[j]有決策單調性,我們用佇列(?)來維護i 的最優更新。上**(略醜)
#include#includeusing namespace std;
long long dp[50005];
struct sdd[50005],dd[50005];//存地
bool com(const sd &a,const sd &b)
long long cx[50005];
struct qjque[50005];//存方案,l到r的dp用num來更新
int head=1,tail=0;
int pd(int l,int r,long long dq,long long fq)
//二分查詢i更優的位置,即方案中的l
int tot;
long long f[50005];
void push(int x)
//隊尾方案的l用x更優,隊尾方案被完全覆蓋,出棧;
if((f[k]-f[x])*dd[tot].y>dp[x]-dp[k])//x這個方案能用來更新dp
int main()
for(int i=0;ique[head].r)head++;//去掉隊頭過期元素
int k=que[head].num;
dp[i]=dp[k]+f[k]*dd[i].y;//更新i的dp
push(i);//把i方案入隊
} printf("%i64d",dp[tot]);
}
BZOJ 1597 土地購買
傳送門 思路 顯然如果不對輸入資料加以處理,這道題就只能用 o 3n o 3 n 的動態規劃來做。由於購買土地的花費等於最大的長乘以最大的寬,我們可以發現,若一塊土地的長寬比另一塊土地的長寬都大,那麼另一塊土地是沒有用的。所以我們考慮刪去另一塊。顯然這是乙個偏序問題,我們把土地按長排序。要刪去長寬都...
bzoj1597 土地購買 斜率優化
農夫john準備擴大他的農場,他正在考慮n 1 n 50,000 塊長方形的土地.每塊土地的長寬滿足 1 寬 1,000,000 1 長 1,000,000 每塊土地的 是它的面積,但fj可以同時購買多快土地.這些土地的 是它們最大的長乘以它們最大的寬,但是土地的長寬不能交換.如果fj買一塊3x5的...
bzoj 1597 土地購買(斜率優化dp)
題目戳這裡 2102912 kamisama123 1597 accepted 6076 kb 152 ms c edit 1171 b 2017 06 07 19 44 16 2102894 kamisama123 1597 accepted 6080 kb 160 ms c edit 982 b...