感悟:
dp的斜率优化的基础用法是在1D1D型的dp上,如HNOI2008玩具装箱,这里是
d
p
[
i
]
=
min
d
p
[
j
]
+
(
s
[
i
]
−
s
[
j
]
−
L
)
2
dp[i]=\min{dp[j]+(s[i]-s[j]-L)^2}
dp[i]=mindp[j]+(s[i]−s[j]−L)2
这里假设一个
j
1
<
j
2
j_1<j_2
j1<j2且满足
j
1
j_1
j1的答案没有
j
2
j_2
j2的优,那么可以推得一个斜率dp的公式:
这里我们可以将
Y
(
j
)
=
d
p
[
j
]
+
(
S
[
j
]
+
L
)
2
Y(j)=dp[j]+(S[j]+L)^2
Y(j)=dp[j]+(S[j]+L)2,
X
(
j
)
=
S
[
j
]
)
X(j)=S[j])
X(j)=S[j])。
于是就可以得到一个斜率的式子
Y
(
j
2
)
−
Y
(
j
1
)
/
X
(
j
2
)
−
X
(
j
1
)
Y(j_2)-Y(j_1)/X(j_2)-X(j_1)
Y(j2)−Y(j1)/X(j2)−X(j1)
这里可以用一个队列来维护,得到一个类似的凸包的图形。
对
j
1
<
j
2
<
j
3
j_1<j_2<j_3
j1<j2<j3,像维护凸包一样,当
s
l
o
p
e
(
j
1
,
j
2
)
>
s
l
o
p
e
(
j
1
,
j
3
)
slope(j_1,j_2)>slope(j_1,j_3)
slope(j1,j2)>slope(j1,j3)可以将
j
2
j_2
j2删除掉。
(这个需要满足单调性原理,可以看博客中的tournament那道题)
然后用二分的办法找到临界点
p
p
p,满足
i
<
p
i<p
i<p都是满足
2
∗
s
[
i
]
>
=
s
l
o
p
e
(
i
−
1
,
i
)
2*s[i]>=slope(i-1,i)
2∗s[i]>=slope(i−1,i),
i
>
p
i>p
i>p都是
2
∗
s
[
i
]
<
s
l
o
p
e
(
i
,
i
+
1
)
2*s[i]<slope(i,i+1)
2∗s[i]<slope(i,i+1),这样
p
p
p就是当前的最优解;
而这道题满足一个性质–四边形不等式;
当
d
p
[
i
]
=
d
p
[
j
]
+
w
(
i
,
j
)
dp[i]=dp[j]+w(i,j)
dp[i]=dp[j]+w(i,j)时,对
w
(
i
,
j
)
w(i,j)
w(i,j)如果满足
w
(
i
,
j
)
+
w
(
i
+
1
,
j
+
1
)
<
=
w
(
i
+
1
,
j
)
+
w
(
i
,
j
+
1
)
w(i,j)+w(i+1,j+1)<=w(i+1,j)+w(i,j+1)
w(i,j)+w(i+1,j+1)<=w(i+1,j)+w(i,j+1),那么最优解对应的点就会是单调增加的,即决策单调性;
这样就可以只维护凸包的
i
>
p
i>p
i>p部分,前面可以直接排除掉,用个队列就可以
O
(
n
)
O(n)
O(n)解决问题。