bzoj1010
斜率優化dp首題,多寫一點吧。
設\(f_i\)為\(i\)點時的最優方案,\(s_i\)為\(i\)點\(c_i\)字首和,則有\(f_i = min\\)。
不要被這個「決策單調性」給唬住,其實就是證明:若在計算\(f_i\)的時候,選\(j\)比選\(k\)好,那麼之後永遠都有選\(j\)比選\(k\)好。
證明:首先設\(t_x = s_x+x,c = l+1\)且\(j > k\),選\(j\)比選\(k\)好,簡化之後的表示
\(f_j+(t_i-t_j-c)^2 < f_k + (t_i-t_j-c)^2\)
\(\leftrightarrow f_j+t_i^2+t_j^2+c^2-2t_it_j+2t_jc-2t_ic < f_k+t_i^2+t_k^2+c^2-2t_it_k+2t_kc-2t_ic\)
\(\leftrightarrow f_j+t_j^2-2t_it_j+2t_jc - f_k - t_k^2 + 2t_it_k - 2t_kc < 0\)
\(\leftrightarrow f_j + t_j^2+ 2t_jc - f_k - t_k^2 - 2t_kc < 2t_it_j - 2t_it_k\)
由於\(t\)是單調上公升的,所以\(2t_j-2t_k>0\),所以
\(\mbox\leftrightarrow \displaystyle\frac < t_i\)
又因為\(t\)是單調上公升的,所以一旦滿足了這個條件,選\(j\)永遠比選\(k\)好。
這一步其實就是看分子分母,化出和\(j\),\(k\)有關的式子,就可以了。
設\(f_x = t_x^2+f_x+2ct_x\),\(g_x=2t_x\)
則原式可化成\(\displaystyle\frac,由於\(g\)單調增,不等號左邊的式子(上下同乘\(-1\)後)就是在平面\(gof\)上的一條直線\((k,j)\)的斜率(記為\(k_\))。
設\(x, y, z\)滿足\(x < y < z\),且\(k_>k_\),則選\(y\)不可能更優。
證明:考慮反證法,若\(y\)優於\(x\)和\(z\),則有:
\(\displaystyle\frac>t_i\)(這個式子其實是將step2中的\(j>k\)反過來推出來的)
和\(\displaystyle\frac
即\(k_=\displaystyle\frac>\displaystyle\frac=k_\)與題設矛盾。
這裡應該先考慮\(y\)優於\(x\)和\(z\),推出式子後得出斜率的單調結論。
單調佇列是乙個雙端佇列。
由於step2,3,若在\(i\)處有\(k_(\(k, j\)位於隊首),則應該令\(k\)出隊,反覆執行直至佇列中只有乙個元素或不滿足條件為止,此時隊首即為決策。
當計算出\(f_i\)後,利用step4的結論,在隊尾不斷出隊直至直至佇列中只有乙個元素或不滿足條件為止,並將\(i\)放入隊尾。
#include #include typedef long long ll;
const int n = 50000 + 10;
const double eps = 1e-10;
int n, l;
ll c[n], f[n], s[n], t[n], c, f[n], g[n];
int q[n], qhd, qtl;
inline double k(int x, int y)
inline int dcmp(double x)
int main ()
// dp
f[0] = 0;
q[qtl++] = 0;
for (int i = 1; i <= n; ++i)
int j = q[qhd];
f[i] = f[j] + (t[i] - t[j] - c) * (t[i] - t[j] - c);
f[i] = t[i] * t[i] + f[i] + 2 * c * t[i]; // mark
while (qhd < qtl - 1)
q[qtl++] = i;
} printf("%lld\n", f[n]);
return 0;
}
這個題是我寫的斜率優化dp的第一題,感覺斜率優化很模板化,只需要一點點推就行了,要注意的一點是斜率優化的複雜度\(o(n)\)的,另外,演草時要好好寫字,否則真的會看不清...(例如mark處我一開始寫的是+t[i]
) 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教授要求在乙個一維容器中的玩具編號是連續的。同時...