单调性优化DP
Tags:动态规划
作业部落链接
一、概述
裸的DP过不了,怎么办?
通常会想到单调性优化
- 单调队列优化
- 斜率优化
- 决策单调性
二、题目
- [x] 洛谷 P2120 [ZJOI2007]仓库建设
- [x] 洛谷 P2900 [USACO08MAR]土地征用
- [x] 洛谷 P3195 [HNOI2008]玩具装箱
- [x] 洛谷 P3628 [APIO2010]特别行动队
- [ ] 洛谷 P4360 [CEOI2004]锯木厂选址(留作复习)
- [x] 洛谷 P4072 [SDOI2016]征途
- [x] 洛谷 P3648 [APIO2014]序列分割
- [ ] 洛谷 P4027 [NOI2007]货币兑换
- [x] 洛谷 P2627 修剪草坪
- [x] 洛谷 P2569 [SCOI2010]股票交易
- [x] 洛谷 P2254 [NOI2005]瑰丽华尔兹
- [ ] BZOJ 4709 柠檬
三、各种方法
单调队列优化
你会发现(i)这个状态是由([i-k1,i-k2])转移过来的,而且(j)对于([j+k2,j+k1])的贡献是一样的,和后一个接受贡献的(i)无关,那么就可以使用单调队列优化了,每次就是队首的点来更新后面的状态
题目:修剪草坪、股票交易
斜率优化
当发现(j)转移到(i)的时候贡献和(i)有关系的时候,那么就要用到斜率优化了
比如说$$dp[i]=min(dp[i],dp[j]+(A[i]-A[j])^2)$$本来应该枚举(j)的,但是把式子化简$$dp[j]+A[j]^2=2A[i]A[j]+(dp[i]-A[i]^2)$$
再看看$$y=kx+b$$诶很像哦,那么我们要求的(dp[i])就是截距(+A[i]^2)咯
那么一个状态(j)可以抽象成一个点((x,y)=(A[j],dp[j]+A[j]^2))
此时斜率是(2A[i]),那么最小的截距就可以由上凸壳的最下端点转移而来
所以用单调队列维护凸壳就可以实现(O(1))转移了
例题见上题单序列分割及以上所有,建议初学者先做[HNOI2008]玩具装箱
决策单调性优化
暂不会,例题见柠檬
四、做题经验
斜率优化通常维护这种东西
然后红线就是斜率,黑线就是要维护的凸壳
考虑清楚斜率的单调性以及正负就好了
一般斜率优化的题很好写暴力,多拍一下