紀念不看題解\(a\)掉的第乙個斜率優化dp:p3195 [hnoi2008]玩具裝箱toy
乙個月後補的重點:斜率優化的本質就是利用推出來的公式決定維護乙個凸包,用單調佇列來維護這個凸包,因為我們假定\(jdp_k\),所以每次決策顯然就取隊頭,從而得到最優解
定義陣列\(sum_i\)為長度字首和,陣列\(dp_i\)為前\(i\)個玩具的最小花費
當前塊末\(i\)與前一塊末\(j\)狀態轉移為\(dp_i=dp_+i-(j+1)+sum_i-sum_j-l\)
假設\(j,從\(k\)轉移比\(j\)轉移更優:
\(dp_j+[i-(j+1)+sum_i-sum_j-l]^2>\)
\(dp_k+[i-(k+1)+sum_i-sum_k-l]^2\)
\(\longrightarrow\)
\(dp_j+[(i+sum_i-l)+(-j-1-sum_j)]^2>\)
\(dp_k+[(i+sum_i-l)+(-k-1-sum_k)]^2\)
\(\longrightarrow\)
\(dp_j+(i+sum_i-l)^2+2(i+sum_i-l)(-j-1-sum_j)+(-j-1-sum_j)^2>\)
\(dp_k+(i+sum_i-l)^2+2(i+sum_i-l)(-k-1-sum_k)+(-k-1-sum_k)^2\)
\(\longrightarrow\)
\(dp_j+2(i+sum_i-l)(-j-1-sum_j)+(-j-1-sum_j)^2>\)
\(dp_k+2(i+sum_i-l)(-k-1-sum_k)+(-k-1-sum_k)^2\)
\(\longrightarrow\)
\(dp_j-dp_k+(-j-1-sum_j)^2-(-k-1-sum_k)^2>\)
\((i+sum_i-l) \\)
\(\longrightarrow\)
\(\dfrac>i+sum_i-l\)
:然後你就會樣例都過不了,為什麼?根據單調性\(2[(-k-1-sum_k)-(-j-1-sum_j)]\)為負,符號要變,所以最後的式子為
\(\dfrac
\(i+sum_i-l\)單調遞增,所以我們用單調佇列維護上凸包
#includeusing namespace std;
typedef long long ll;
const ll maxn=200000;
inline ll read()
while(c>='0'&&c<='9')
x=(x<<3)+(x<<1)+c-'0',c=getchar();
return x*f;
}ll n,l,head,tail;
ll sum[maxn],dp[maxn],q[maxn];
inline double get(ll i)
inline ll p_(ll x)
inline double xl(ll j,ll k)
int main()
printf("%lld",dp[n]);
return 0;
}
P3195 HNOI2008 玩具裝箱TOY
題目描述 p教授要去看奧運,但是他捨不下他的玩具,於是他決定把所有的玩具運到北京。他使用自己的壓縮器進行壓縮,其可以將任意物品變成一堆,再放到一種特殊的一維容器中。p教授有編號為1 n的n件玩具,第i件玩具經過壓縮後變成一維長度為ci.為了方便整理,p教授要求在乙個一維容器中的玩具編號是連續的。同時...
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
題目 p教授要去看奧運,但是他捨不下他的玩具,於是他決定把所有的玩具運到北京。他使用自己的壓縮器進行壓縮,其可以將任意物品變成一堆,再放到一種特殊的一維容器中。p教授有編號為1.n的n件玩具,第i件玩具經過壓縮後變成一維長度為ci.為了方便整理,p教授要求在乙個一維容器中的玩具編號是連續的。同時如果...