倉庫建設 斜率優化DP

2022-04-28 20:06:12 字數 1277 閱讀 2738

zjoi2007倉庫建設

講乙個比較呆一點的做法:

設f[i][1]表示後i個點且i點建倉庫的最優解,f[i][0]表示後i個點且i點不建倉庫的最優解。

那麼顯然可以從後往前dp:

f[i][0]=mini;

f[i][1]=mini+c[i];

令s[j]=∑i<=

k(x[j]-x[k])*p[k]。

則s[j]=∑i<=

k(x[j]*p[k]-x[k]*p[k])=∑i<=

kx[j]*p[k]-∑i<=

kx[k]*p[k]=x[j]*∑i<=

kp[k]-∑i<=

kx[k]*p[k]。

不妨令a[x]=x[x]*p[x]。

那麼s[j]可以用字尾和表示為:s=x[j]*(sump[i]-sump[j])-(suma[i]-suma[j])。         

所以f[i][0]=min 。

把式子化成一次函式可得:

f[j]-x[j]*sufp[j]+sufa[j]=-sufp[i]*x[j]+sufa[i]+f[i]

從後往前維護乙個斜率單調遞減的下凸殼即可。

需要注意的是,每次應先轉移好fi。

因為y中含有f[i],沒轉移好f[i]

會影響i入隊時去尾操作。

#include#define rg register

#define il inline

#define db double

#define int long long

using

namespace

std;

il int

gi()

while (ch>='

0'&&ch<='

9') x=(x<<3)+(x<<1)+(ch^48),ch=getchar();

return w?-x:x;

}const

int n=1e6+10

;int

l,r,q[n];

int n,p[n],x[n],c[n],a[n],sufa[n],sufp[n],f[n][2

];il db y(

int x)

il db slope(

int x,int y)

signed main ()

printf(

"%lld\n

",min(f[1][1],f[1][0

]));

return0;

}

by bhllx

ZJOI2007 倉庫建設 斜率優化dp

大腦真是個很優秀的器官,做事情之前總會想著這太難,真的逼著自己做下去,回頭看看,其實也不過如此 很樸素的斜率優化dp了 首先要讀懂題目 我的理解能力好bug啊 然後設 dp i 表示處理完前 i 個傢伙,並且在第 i 個傢伙處建倉的答案 那麼有 dp i min p k x i x k c i 化簡...

bzoj1096 倉庫建設 斜率優化

dsy1096 zjoi2007 倉庫建設 問題描述 l公司有 n個工廠,由高到底分布在一座山上。如圖所示,工廠 1在山頂,工廠 n在山腳。由於這座山處於高原內陸地區 乾燥少雨 l公司一般把產品直接堆放在露天,以節省費用。突然有一天,l公司的總裁 l先生接到氣象部門的 被告知三天之後將有一場暴雨,於...

斜率優化 DP

我們知道,有些dp方程可以轉化成dp i f j x i 的形式,其中f j 中儲存了只與j相關的量。這樣的dp方程我們可以用單調佇列進行優化,從而使得o n 2 的複雜度降到o n 可是並不是所有的方程都可以轉化成上面的形式,舉個例子 dp i dp j x i x j x i x j 如果把右邊...