1. 程式人生 > >BZOJ1010單調性DP優化

BZOJ1010單調性DP優化

多個 實現 同時 研究 -1 ems bsp amp 掃描

1010: [HNOI2008]玩具裝箱toy

Time Limit: 1 Sec Memory Limit: 162 MB
Submit: 10707 Solved: 4445
[Submit][Status][Discuss]

Description

  P教授要去看奧運,但是他舍不下他的玩具,於是他決定把所有的玩具運到北京。他使用自己的壓縮器進行壓
縮,其可以將任意物品變成一堆,再放到一種特殊的一維容器中。P教授有編號為1...N的N件玩具,第i件玩具經過
壓縮後變成一維長度為Ci.為了方便整理,P教授要求在一個一維容器中的玩具編號是連續的。同時如果一個一維容
器中有多個玩具,那麽兩件玩具之間要加入一個單位長度的填充物,形式地說如果將第i件玩具到第j個玩具放到一
個容器中,那麽容器的長度將為 x=j-i+Sigma(Ck) i<=K<=j 制作容器的費用與容器的長度有關,根據教授研究,
如果容器長度為x,其制作費用為(X-L)^2.其中L是一個常量。P教授不關心容器的數目,他可以制作出任意長度的容
器,甚至超過L。但他希望費用最小.

Input

  第一行輸入兩個整數N,L.接下來N行輸入Ci.1<=N<=50000,1<=L,Ci<=10^7

Output

  輸出最小費用

Sample Input

5 4
3
4
2
1
4

Sample Output

1 線性的DP關系式為 dp[i]=min{dp[i],dp[j]+(sum[i]-sum[j]+i-j-1-L)^2} 顯然超時,考慮優化。 假設i選擇時有k優於j(k>j 之所以選k大於j的原因是從前往後掃,考慮後面優於前面是否可以舍棄前面的); 1:首先證明滿足單調性(換句話說就是對一個當前的i來說,如果k優於j,那麽i之後k都優於j)
有dp[k]+(sum[i]-sum[k]+i-k-1-L)^2<dp[j]+(sum[i]-sum[j]+i-j-1-L)^2;(不妨令f[i]=sum[i]+i,C=1+L) 則有dp[k]+(f[i]-f[k]-C)^2<dp[j]+(f[i]-f[j]-C)^2 要證對於任意t>i 均有dp[k]+(f[t]-f[k]-C)^2<dp[j]+(f[i]-f[j]-C)^2 (令f[t]=f[i]+v,嗯經過一系列運算可以知道這個可以證明) 2:利用這個結論 若是利用這個結論條件肯定得先滿足吧 所以有dp[k]+(f[i]-f[k]-C)^2<dp[j]+(f[i]-f[j]-C)^2
==》》 (dp[k]+(f[k]+c)^2-dp[j]-(f[j]+c)^2)/2*(f[k]-f[j])<=f[i] (1)
即在從前向後掃描的過程中 只要滿足(1)式,就可以去掉隊首,若去不掉就將隊首作為中介進行運算(這是第一個while所在) 其次,若是將一個元素添加到隊列中,必須要將其和原倒數第一個進行比較,若其優於倒數第一個,則將其替換掉(第二個while),這個的意義所在是防止出現 中優,次優,最優這種隊列排序,如果沒有while的話,計算時只能選取一個中優的而不是最優的(這個是第一個while不能去掉的)具體代碼實現請移步http://hzwer.com/2114.html

BZOJ1010單調性DP優化