HNOI2008 玩具裝箱TOY

2022-08-20 23:12:15 字數 1027 閱讀 4915

here

寫的第一道斜率優化…感覺這個板題還蠻簡單的

首先按普通思路,我們令 \(dp[i]\),為前 \(i\) 個物品的最小價值,那麼可以很容易列出方程:

\[dp[i] = min\

\]這是乙個 \(o(n^2)\)的 \(dp\),我們考慮如何優化它:

令 \(s[x] = sum[x] + x,\ l=l+1\),則

\[dp[i] = dp[j]+(sum[i]-sum[j]+i-j-1-l)^2 \\

= dp[j] + (s[i] - s[j] - l) ^ 2 \\

= dp[j] + s[i]^2 + (s[j]+l)^2 - 2*s[i]*(s[j]+l)\]

\[dp[i] + 2 * s[i] * (s[j] + l) = dp[j] + s[i]^2 + (s[j] + l) ^ 2

\]在這個式子裡面,我們把 \(dp[j] + s[i]^2 + (s[j] + l)\) 看作因變數, \(s[j]+l\)看作自變數,\(dp[i]\) 看作 \(y\) 軸截距,\(2*s[i]\)(已知量)看作直線斜率,那麼我們就是要找到乙個決策點 \(j\) 使得截距最小,根據 \(k=2*s[i]\) 我們可以發現這個斜率是單調遞增的,那麼我們維護的是乙個下凸包,不多贅述。

#includeusing namespace std;

typedef long long ll;

typedef double d;

const int n = 50050;

ll f[n], s[n], sum[n], n, l;

ll q[n], h, t;

d x(ll i)

d y(ll i)

d slope(ll i, ll j)

int main()

cout << f[n];

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教授要求在乙個一維容器中的玩具編號是連續的。同時...