洛谷 2120 倉庫建設(詳解)

2021-08-17 14:18:26 字數 2132 閱讀 6578

倉庫建設

終於有時間寫寫部落格了!

聽說這題是

noi/ctsc

的哇!激動!先看題意!

question

很熟悉吧,這是一道動態規劃的題:若要求從1~n的貨物全部都安置的最小費用,就要用1~n-1的最小費用去更新……這就轉化為了子問題的求解典型的dp。

根據子問題的定義,我們可以定義dp方程:

dp[ i ]表示在i這個地方建設倉庫並且將 i 之前的所有貨物都處理完的最小費用值。

由於貨物只能往山下運送,那麼也就是說 k 處的貨物只能向 k~n 運送安置,可以列舉 j ——上乙個建設倉庫的地方,那麼從 j+1到 i 這一段都將要安置到在 i 這個地方建設的倉庫中,費用為 sigma(j+1->i) 。

得到dp方程:

dp[ i ]=min) }

列舉 i 和 j 複雜度近似o( n^2 ),而計算費用的和需要o( n ),那麼總複雜為o( n^3 ),**!

sigma(k=j+1->i) ) =x[ i ]*sigma( k=j+1->i ) - sigma( k=j+1->i )

看出來了嗎,這樣我們就不需要for一遍去求安置費用了,我們可以記錄兩個字首和:

1、sum1[ i ]:sum1[ i ]=sum1[ i - 1 ]+p[ i ]

2、sum2[ i ]:sum2[ i ]=sum2[ i - 1 ]+p[ i ]*x[ i ]

那麼全新的方程:

dp[ i ] = dp[ pos ]+x[ i ]*(sum1[ i ]-sum1[ pos ])-(sum2[ i ]-sum2[ pos ])+c[ i ],其中pos表示最優位置

這樣複雜度降到了o( n^2 ),然而並沒有卵用……

進行斜率優化:

dp[ k ]+x[ i ]*(sum1[ i ]-sum1[ k ])-(sum2[ i ]-sum2[ k ])+c[ i ] —— 1式

dp[ g ]+x[ i ]*(sum1[ i ]-sum1[ g ])-(sum2[ i ]-sum2[ g ])+c[ i ] ——2式

由於 k 比 g 優,那麼 1式 <= 2式!

(dp[ k ]-dp[ j ]+sum2[ k ]-sum2[ j ]) / (sum1[ k ]-sum1[ j ]) <= x[ i ],我們把不等式左邊記為斜率

維護乙個凸包(斜率遞增),並且使用佇列儲存符合凸包的點,那麼每一次碰到新的 i 時,我們只需要比較x[ i ]和隊首和隊首+1的形成的斜率的值(k=head+1 , g=head),如果小於x[ i ],那麼說明head的費用一定不比head+1優!這時我們可以將head刪掉,將head+1作為新的隊首;否則說明當前 i 下,head比head+1優,不刪。注意,需要保證佇列之中有東西

最後得到的隊首一定是對於當前 i來說一定是最優的,那麼用之更新!

這時候就入隊嗎?不!

更新完畢,我們還是需要維護乙個凸包,也就是佇列尾部:tail 以及 tail-1 和將要入隊的 i 必須保證:

tail與tail-1構成的斜率小於tail與i構成的斜率!

好了,這就可以將 i 入隊了!

最後的答案就是dp[ n ]

ac下面放程式:

#includeconst int n=1000000+5;

using namespace std;

long long dp[n],sum1[n],sum2[n],x[n],p[n],c[n];

int n,h,t,q[n<<4];

double slope(int j,int k)

int main()

for(int i=1;i<=n;i++)

cout《呼!ok,返校!

洛谷 2120 ZJOI2007 倉庫建設

題目描述 l公司有n個工廠,由高到底分布在一座山上。工廠1在山頂,工廠n在山腳。由於這座山處於高原內陸地區 乾燥少雨 l公司一般把產品直接堆放在露天,以節省費用。突然有一天,l公司的總裁l先生接到氣象部門的 被告知三天之後將有一場暴雨,於是l先生決定緊急在某些工廠建立一些倉庫以免產品被淋壞。由於地形...

洛谷 P2120 ZJOI2007 倉庫建設

題幹重點 第i個工廠目前已有成品ai件,在第i個工廠位置建立倉庫的費用是bi。對於沒有建立倉庫的工廠,其產品應被運往其他的倉庫進行儲藏 只能運往編號更大的工廠的倉庫,一件產品運送1個單位距離的費用是1 告訴你工廠的位置,在每乙個工廠建立倉庫的費用,以及它們原有產品的個數,產品只能往編號高的地方運,求...

P2120 倉庫建設

又是斜優,這裡是直通車 n 個工廠,每個工廠有三個屬性 座標 x 物品數 p 建設花費 c 可以選若干工廠建倉庫,第 i 個工廠的物品只能運往座標大於等於它的位置倉庫,單個物品移動單位長度花費 1 求儲存所有貨物的最小花費 1 leq n leq 10 6,0 leq x,p,c leq 2 ans...