EagleBear2002 的博客

这里必须根绝一切犹豫,这里任何怯懦都无济于事

DP 常见优化技巧

摘要

2 蓝 5 紫 4 黑

DP 优化的核心思想:在状态转移时及时排除不可能最优的决策,保持候选集合的有效性和秩序性。

倍增优化

【蓝色】P2106 Sam 数 - 洛谷

有点复杂,先跳过:【紫色】P1081 [NOIP 2012 提高组] 开车旅行 - 洛谷

TODO:【紫色】P1357 花园 - 洛谷

单调队列优化

OI 是一个单调队列,如果有人比你年龄小,还比你强,那么你应该出列了。

状态转移集合是一个单调队列,如果 j2j1 更容易符合转移条件,且收益更大,那么 j1 应该出列。

对于状态转移方程模型:

f(i)=maxL(i)jR(i){f(j)+val(i,j)}

val(i,j) 的每一项仅与 i,j 其中一个有关,可以使用单调队列维护可行决策以缩小决策范围。

【蓝色】P10978 Fence - 洛谷 状态转移方程如下:

f(i,j)=max{f(i1,j)f(i,j1)maxjLik<j{f(i1,k)+pi×(jk)}j<Si}

【紫色】P10977 Cut the Sequence - 洛谷 状态转移方程如下:

f(i)=min0j<ik=j+1iakM{f(j)+maxj<ki{ak}}

单调栈的使用与单调队列基本类似:

单调栈 单调队列
方程性质 导函数递增、求最大值(P5504 [JSOI2011] 柠檬 - 洛谷),或者导函数递减、求最小值 函数递增、求最小值(P10977 Cut the Sequence - 洛谷),或者导函数递减、求最大值(P10978 Fence - 洛谷
决策性质 决策 j 总是离 i 越近越合法 决策 j 总是离 i 越远越合法

斜率优化

对于状态转移方程模型:

f(i)=maxL(i)jR(i){f(j)+val(i,j)}

val(i,j) 中存在与 i,j 同时相关的项,可以考虑使用线性规划建模,并用单调队列维护下凸壳(上凸壳)以缩小决策范围。

【紫色】P3195 [HNOI2008] 玩具装箱 - 洛谷 状态转移方程如下:

f(i)ti2+2ti(L+1)(L+1)2=min0j<i{f(j)+tj2+2tj(L+1ti)}

【紫色】P5785 [SDOI2012] 任务安排 - 洛谷 状态转移方程如下:

f(i)sumTi×sumCiS×sumCn=min0j<i{f(j)sumTi×sumCjS×sumCj}

【黑色】P3571 [POI 2014] SUP-Supercomputer - 洛谷 计算公式如下:

f(i)=maxh{h+sh+1i}=maxh{ih+sh+1i}

四边形不等式

对于状态转移方程模型:

f(i)=maxL(i)jR(i){f(j)+val(i,j)}

val(i,j) 满足四边形不等式:

abcd.val(a,d)+val(b,c)val(a,c)+val(b,d)

f(i) 具有决策单调性,即 p(i)i 的增加而单调不减,其中 p(i) 表示状态转移时关于 i 的决策,即

p(i)=argmax0j<i{f(j)+val(i,j)}

虚假的单调性:证明其满足四边形不等式然后推导单调;

真正的单调性:暴力打印 p(i) 然后找规律发现单调性。

【紫色】P1912 [NOI2009] 诗人小G - 洛谷

f(i)=min0j<i{f(j)+|sisj+ij1L|P}

其中

val(i,j)=|sisj+ij1L|P

满足四边形不等式。

TODO:【紫色】P4767 [IOI 2000] 邮局 加强版 - 洛谷

TODO:【黑色】P8864 「KDOI-03」序列变换 - 洛谷

DP 杂题选讲

【紫色】P2470 [SCOI2007] 压缩 - 洛谷

【黑色】P2703 [NOI2006] 千年虫 - 洛谷

TODO:【黑色】P1721 [NOI2016] 国王饮水记 - 洛谷

目前暂无正解:【黑色】P2145 [JSOI2007] 祖玛 - 洛谷

TODO:【黑色】P8275 [USACO22OPEN] 262144 Revisited P - 洛谷

TODO:【黑色】P8194 [USACO22FEB] Phone Numbers P - 洛谷

TODO:【黑色】P12495 [集训队互测 2024] 链覆盖 - 洛谷

TODO:【黑色】P12483 [集训队互测 2024] 人间应又雪 - 洛谷

【黑色】P10197 [USACO24FEB] Minimum Sum of Maximums P - 洛谷