【斜率优化】【决策单调】xjb讲课

大佬们要让蒟蒻给他们讲斜率优化 …….(色色发抖

斜率优化是什么呢,先看点没用的东西。
考虑一类动态规划,满足这样的性质:
状态数有 n 个,一个状态的决策数有n
形似 f[i]=i1f[j] 定义♂为乱七八糟的运算
这样的dp有什么好的性质呢???

首先考虑这样一种 子类型

f[i]=mini1j=1f[j]+w[j,i]

当对于一个w[j,i]满足四边形不等式的时候,决策单调
那么我们首先来说什么叫四边形不等式
w[i,j]+w[i+1,j+1]w[i+1,j]+w[i,j+1]
是不是一脸蒙蔽?
其实是网上的柿子非得撞壁,写成这个13样,不信你移个项
w[i+1,j+1]w[i+1,j]w[i,j+1]w[i,j]
就是这样的,对于 i+1 状态的决策集, j 位置决策的增长幅度不如在i位置的决策集中 j+1 位置的增长幅度大
显然这意味着,如果一个决策在 i 位置就已经被淘汰,无论他怎么跑,都追不上其他在i+1位置的决策了,所以有这样的性质
对于状态 x 的两个决策位置 ij 如果 i 不如j优,则对 x+1 必然不选择 i
这有啥用啊?就是把你原来从1枚举变成从x1决策点枚举了??
还是暴力,有个卵用?
那我们换一个角度思考,之前都是对状态想决策,现在变成对决策想状态。
对于一个决策 j 能决策的状态区间是什么,一定是状态集中的一段连续的区间
所以我们可以考虑这样一个问题,(以下数字表示决策点位置编号)

对于决策1有这样的决策区间
1111111111
对于决策2来了,他一定决策这样的区间
1111122222
以此类推
所以我们对每个决策点决策区间维护单调栈,每来一个决策,就在单调栈中二分决策点变化位置,弹掉后面的区间,拆开当前区间即可

废话说完了

斜率优化是个啥???
考虑这样另一种形式的子类型

f[i]=mini1j=1(a[i]f[j]+b[i]g[j])

美化以下柿子
f[i]=mini1j=1(a[i]x[j]+b[i]y[j])
ax+by 的最值?
变成斜截式 y=bax+Pb
现在一个决策点变成了一个数对, (x,y)
问题转化成了给定一些斜率固定的直线,以及二维平面上的点集
求一条直线在平面上穿过某一点使得与y轴截距最值
直线方程?线性规划??
显然是卡在凸包上的最优啊
下面分情况讨论
如果 x 是递增的,斜率也是递增的
就相当于一边向后插点维护凸包,一边在前面用直线卡掉不合法的点
显然单调队列,队尾插点,队头按直线弹掉,时间复杂度O(n)
如果x递增,斜率不递增,就要正常维护凸包,在凸包上二分找到直线卡的点位置。
时间复杂度 O(nlog2n)
如果x和斜率都不递增,用平衡树维护凸包,动态插点,删点,反正我不会写。
可写的方法是cdq,对x进行cdq,左右分别维护凸包, O(n) 合并凸包。
时间复杂度 O(nlog2n)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值