USACO16FEB 再探圓形穀倉(斜率優化DP)
阿新 • • 發佈:2018-11-06
題意
個順時針排列的牛棚,可以開
個口讓牛順時針進入,已知每個牛棚需要多少隻牛,問所有牛在牛棚內行走的距離總和最小值。
思路
序列倍長,斷環成鏈,區間轉移,線性動歸,這種套路實在見得多了,不難打出一個 的 如下:
FOR(r,0,n-1)
{
FOR(i,1,n)cnt[i]=cnt[i-1]+a[r+i],sum[i]=sum[i-1]+a[r+i]*i;
memset(dp,0x3f,sizeof(dp));
dp[0][0]=0;
FOR(i,1,K)
FOR(j,1,n)
FOR(k,0,j-1)
dp[i][j]=min(dp[i][j],dp[i-1][k]+(sum[j]-sum[k])-(k+1)*(cnt[j]-cnt[k]));
ans=min(ans,dp[K][n]);
}
現在優化掉其中一維即可,顯然是轉移的那一維,列出轉移式:
把和
有關或常數提出來,將只和
有關、與
有關的分別並列得到:
令
原式又變成
維護一個
的下凸包,即保證斜率一定時,
軸上截距最小,而斜率的
又是單調遞增的,那斜率優化就顯然了。
總結一下斜率是如何優化
的。
回到我們的單調佇列優化
,
,
相同。
其中
是僅與
相關的函式,
是隻與
相關的函式,維護一個關於
的單調佇列即可。
而當出現了