HNOI2008 玩具裝箱TOY

2022-02-27 07:43:36 字數 1572 閱讀 9911

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 4342

14輸出樣例#1:

1一句話題意:給出\(n\)個玩具,你可以將一些連續的玩具放到同乙個箱子內,這樣的費用是\(x=j-i+\displaystyle_} c_k\),問要裝這\(n\)個玩具所需要的最小費用.

題解:dp方程應該很顯然,我們定義\(f[i]\)表示裝到第\(i\)個玩具所需要的最小費用.那麼則有\(f[i]=min(f[j]+(sum[i]+i-sum[j]-j-l-1)^2\),其中\((j.按照慣例,我們還是先對這個式子進行化簡,為了簡便計算,這裡用\(a[i]\)表示\(sum[i]+i\), 用\(b[i]\)表示\(sum[i]+i+l+1\),設\(j\)狀態為轉移到\(i\)狀態的最優情況,則有:$$f[i]=f[j]+(a[i]-b[i])^2$$

展開得:$$f[i]=f[j]+a[i]2-2*a[i]*b[j]+b[j]2$$

將所有只含有\(i\)的以及含有\(i,j\)兩項乘積的都放到左邊:$$2a[i]b[j]+f[i]-a[i]2=f[j]+b[j]2$$

可以將\(b[j]\)看做直線的自變數\(x\),將\(2*a[i]\)看做直線的斜率\(k\),將\(f[j]+b[j]^2\)看做直線的\(y\),接下來一波斜率優化的套路就可以了.

#includeusing namespace std;

const int n=50000+5;

typedef long long lol;

lol n, l, h, t, q[n], f[n], c[n], s[n];

inline lol a(lol i)

inline lol b(lol i)

inline lol x(lol i)

inline lol y(lol i)

inline double slope(lol i, lol j)

int main()

cout << f[n] << endl;

return 0;

}

HNOI2008 玩具裝箱toy

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

HNOI2008 玩具裝箱toy

dp i min dp j sum i sum j c 2 dp k sum i sum k c 2 dp k si sum k 2 dp k si 2 2 si sum k sum k 2 dp k sum k 2 dp j sum j 2 2 si sum k sum j yk yj 2 si ...

HNOI2008 玩具裝箱TOY

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