P3195 HNOI2008 玩具裝箱TOY

2021-08-02 10:18:36 字數 2552 閱讀 2065

題目描述

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。但他希望費用最小.

輸入輸出格式

輸入格式:

第一行輸入兩個整數n,l.接下來n行輸入ci.1<=n<=50000,1<=l,ci<=10^7

輸出格式:

輸出最小費用

輸入輸出樣例

輸入樣例#1:

5 4

3 4

2 1

4 輸出樣例#1:

1分析:

動態規劃:f[i]表示前i個玩具裝起來的最小費用

s[i]表示前i個玩具的長度和

假設是j到i這段玩具,則狀態轉移方程:f[i]:=min,其中1<=j小於i

計算f[i]時,i,s[i],l這些量都是已知,而含有j的f[j-1],j,s[j-1]是未知的,展開平方式

注意引數分離,定義d[i]=i+s[i]-l,c[j]=j+s[j-1];

則有f[i]:=f[j-1]+sqr(d[i]-c[i])=f[j-1]+sqr(d[i])+sqr(c[i])-2*d[i]*c[i];

————-討論單調性

最基本:j2>j1,f[i]j1>f[i]j2則可以刪除j1(表示的是i能從j1,和j2兩個決策過來)

深入:

f[i]j1小於f[i]j2

f[j1-1]+sqr(d[i])+sqr(c[j1])-2*d[i]*c[j1]>f[j2-1]+sqr(d[i])+sqr(c[j2])-2*d[i]*c[j2]

(f[j1-1]+sqr(c[j1]))-(f[j2-1]+sqr(c[j2]))>2*d[i]*(c[j2]-c[j1]);

令y[i]:=f[i-1]+sqr(c[i])

即y[j1]-y[j2]>2*d[i]*(c[j2]-c[j1])

(y[j2]-y[j1])/(c[j2]-c[j1])<2*d[i]

像這樣兩點形成的斜率,即為斜率優化

令t(j1,j2):=(y[j2]-y[j1])/(c[j2]-c[j1]);

斜率優化:

計算f[i]時,決策j2>j1,如果決策j2優於j1,則滿足t(j1,j2)<2*d[i];

c[i]和d[i]都是遞增的

程式實現

為了始終維護2*d[i]小於t(j1,j2)小於………小於t(jn-1,jn)

刪尾:如果t(jr-1,jr)>t(jr,i) 則刪掉r

插入 刪頭:如果t(j1,j2)<2*d[i],則刪掉j1

取頭program df;

var i,j,n,m:longint;

k,t,l,r:int64;

a,f,c,d,q,s:array[0..100000] of int64;

function deal(x:int64):int64;

begin

exit(f[x-1]+sqr(c[x]));

end;

function check(x,y:int64):real; //求取t(x,y)的值

var i,j:int64;

begin

j:=deal(y)-deal(x);

i:=c[y]-c[x];

exit(j/i);

end;

begin

readln(n,m);

for i:=1 to n do

begin

readln(a[i]);

s[i]:=s[i-1]+a[i];

end;

for i:=1 to n do

begin

d[i]:=i+s[i]-m;

c[i]:=i+s[i-1];

end;

l:=1; r:=0;

for i:=1 to n do

begin

while (r>l) and (check(q[r-1],q[r])>check(q[r],i)) do dec(r); //保證t(r-1,r)小於t(r,i)

inc(r);

q[r]:=i;

while (r>l) and (check(q[l],q[l+1])<2*d[i]) do inc(l); //保證t(1,2)>2*d[i],即確保遞增

f[i]:=f[q[l]-1]+sqr(d[i]-c[q[l]]);

end;

writeln(f[n]);

end.

P3195 HNOI2008 玩具裝箱 題解

p3195 hnoi2008 玩具裝箱 一道比較模板的斜率優化題目 先寫出轉移方程 f i 表示前 i 個已經裝箱完畢的最優解,s i 表示前 i 項 c i 1 的和,f i f j s i s j l 1 2 j i 用 l 1 代替 l 比較好處理,於是方程變成 f i f j s i s j...

P3195 HNOI2008 玩具裝箱TOY

紀念不看題解 a 掉的第乙個斜率優化dp p3195 hnoi2008 玩具裝箱toy 乙個月後補的重點 斜率優化的本質就是利用推出來的公式決定維護乙個凸包,用單調佇列來維護這個凸包,因為我們假定 jdp k 所以每次決策顯然就取隊頭,從而得到最優解 定義陣列 sum i 為長度字首和,陣列 dp ...

洛谷P3195 HNOI2008 玩具裝箱TOY

題目 p教授要去看奧運,但是他捨不下他的玩具,於是他決定把所有的玩具運到北京。他使用自己的壓縮器進行壓縮,其可以將任意物品變成一堆,再放到一種特殊的一維容器中。p教授有編號為1.n的n件玩具,第i件玩具經過壓縮後變成一維長度為ci.為了方便整理,p教授要求在乙個一維容器中的玩具編號是連續的。同時如果...