預處理字首和su
mi=∑
j=1i
ai,為區間求和作準備。
這顯然是dp。 設f
i 表示前
i 件玩具花的最小費用。
則有:
①邊界條件:f0
=0; ②動態轉移方程:fi
=min
(fj+
(i−j
−1+s
umi−
sumj
−l)2
) ;
③答案:fn
。直接求解,時間複雜度為o(
n2) ,顯然會tle。
考慮斜率優化。
原來的方程太複雜了,我們先化簡一下。
通過換元法化簡動態轉移方程,將參量、變數、常量分離。 記g
i=i+
sumi
,gj=
j+su
mj,c
=1+l
, ∴f
i=mi
n(fj
+(gi
−gj−
c)2)
再求解斜率方程。
為了加快求解,我們設法盡可能多的排除一些狀態,這需要決策點之間的比較,我們要找出決策點比較的式子。
設當前要求fi
,存在決策點k,
j ,
k>
j ,滿足決策
k 優於決策j。
∴fk+
(gi−
gk−c
)2≤f
j+(g
i−gj
−c)2
∴fk+(−g
k−c)
2+2g
i(−g
k−c)
≤fj+
(−gj
−c)2
+2gi
(−gj
−c)
∴fk+
(gk+
c)2−
fj−(
gj+c
)2≤2
gi(g
k−gj
) ∵k
>j,
sumk
>su
mj ∴
k+su
mk>j+
sumj
即gk>gj
∴slope(
k,j)
=fk+
(gk+
c)2−
fj−(
gj+c
)2gk
−gj≤
2gi
不難發現,
k 和
j可以看做兩個定點,不因
i 的改變而改變: (f
k+(g
k+c)
2,gk
)和(f
j+(g
j+c)
2,gj
) 。
近一步,∀i
∈n+ ,決策點
i 可以表示為平面上的點(f
i+(g
i+c)
2,gi
)。對於∀
k,j∈
n+,k
>
j , ①當s
lope
(k,j
)≤2g
i 時,決策點
k 優於決策點j;
②當slo
pe(k
,j)>2g
i 時,決策點
k 劣於決策點j。
可以將問題轉化為平面上的點的問題。
現在問題轉化為:
給定平面上
n 個在橫縱座標都單調遞增的點,給定乙個斜率
k,支援以下三種操作:
①插入點操作: 在第n
個點(x
n,yn
)的末尾增加乙個點n+
1 ,也滿足xn
+1>xn
,yn+
1>yn
; ②詢問點操作:
在點集x
= 中尋找乙個點
i ,使得經過
i斜率為
k 的直線在其他所有點之下;
③更改k
操作: 將k
變成k′
,滿足k
′>
k 。
要尋找的點
i ,很明顯
i在點集的下凸殼。
又由於k
是不斷增大的,所以凸殼上要找的點
i的橫座標也在不斷增大。
我們只需要維護乙個單調佇列即可。
隊首維護:
隊首的點為
a ,b,若
slop
e(b,
a)≤2
gi,則將隊首往後移一位;
隊尾維護:
隊末三個點為
a ,b,
c 。 若s
lope
(a,b
)>sl
ope(
a,c)
,則將b
移出隊。
每個點進隊一次,出隊一次。
所以總的時間複雜度為o(
n),空間複雜度也為o(
n)。總算徹底弄清斜率優化的嚴謹過程了。
#include
#include
typedef long long lint;
const int n=65536;
int n,l;
int c[n];
lint sum[n];
lint g[n];
lint c;
lint f[n];
lint x[n];
lint y[n];
intq[n];
int qh,qt;
inline int read(void)
inline double slope(int i,int j)
int main(void)
printf("%lld\n",f[n]);
return
0;}
bzoj 1010 玩具裝箱
題目大意 有n個數,分成連續的若干段,每段 假設從第j個到第i個組成一段 的分數為 x l 2,x為j i sigma ck i k j,其中l是乙個常量 使各段分數的總和最小 思路 斜率優化dp入門題 寫出dp方程之後用單調佇列維護凸包即可 1 include2 include3 include4...
BZOJ1010 玩具裝箱toy
1010 hnoi2008 玩具裝箱toy time limit 1 sec memory limit 162 mb submit 7631 solved 2924 description p教授要去看奧運,但是他捨不下他的玩具,於是他決定把所有的玩具運到北京。他使用自己的壓縮器進行壓縮,其可以將任...
BZOJ1010玩具裝箱Toy
p教授要去看奧運,但是他捨不下他的玩具,於是他決定把所有的玩具運到北京。他使用自己的壓縮器進行壓 縮,其可以將任意物品變成一堆,再放到一種特殊的一維容器中.p教授有編號為1.n的n 件玩具,第 i件玩具經過壓縮後變成一維長度為ci 為了方便整理,p教授要求在乙個一維容器中的玩具編號是連續的。同時如果...