DP优化
斜率优化
求f(i)=max{f(j)+(s(i)−s(j))2},n≤106.
其中s(x)是只和x有关的单调减函数,可以快速计算
显然我们不能Θ(n2)暴力计算,考虑减少决策数,化简得:
f(i)=max{f(j)+s2(i)+s2(j)−2s(i)s(j)}
由于考虑优化决策,把j单独提出:
∃j<i,f(i)=f(j)+s2(i)+s2(j)−2s(i)s(j)
考虑两个决策j,k何时是j更优:
f(j)+s2(i)+s2(j)−2s(i)s(j)≥f(k)+s2(i)+s2(k)−2s(i)s(k)
f(j)−f(k)+s2(j)−s2(k)≥2s(i)[s(j)−s(k)]
令
F(x)=f(x)+s2(x)
则
F(j)−F(k)≥2s(i)[s(j)−s(k)]F(j)−F(k)s(j)−s(k)≥2s(i)
不难发现F(j),F(k),s(j),s(k),s(i)都是定值
对于每个决策j,使其对应一个定点(s(j),F(j)),则F(j)−F(k)s(j)−s(k)为j,k间斜率
考虑维护斜率,画图手玩不难发现(我懒得画图),其实就是维护一个上凸包,如果是小于等于则是下凸包,关于如何维护,我们等会再讲,先考虑答案的处理
注意到,对于最优的j,有
f(i)=F(j)+s2(i)−2s(i)s(j)
其中s2(i)是常数,可以忽略,设
f(i)=−K(i)s(j)+y(j)K(i)=2s(i)y(j)=F(j)=f(j)+s2(j)
设y=kx+b过点(0,−K(i)s(j)+y(j)),(s(j),y(j)),联立得
{b=−K(i)s(j)+y(j)ks(j)+b=y(j)
解得
k=K(i)
发现这是不受决策影响的,而答案就是b,要最大化b就是在凸包上找一个点使得其截距最大,显然可以三分
接下来考虑如何维护凸包
对于新插入的点,由于s(j)的单调性,一定是在结尾处插入,又因为有2s(j)的单调性,所以现在更劣的解一定不会在将来被选到,形式化地,我们有:
∃j:F(j)−F(k)s(j)−s(k)≥2s(i)≥2s(i+Δ)
故而对于新插入的点,我们只需要依次遍历它之前的点,只到一个不可被删去的点,简单代换即可,证明如下:
ifi<j<k∧F(j)−F(k)s(j)−s(k)≥2s(l)∧F(i)−F(j)s(i)−s(j)≥2s(l)F(j)−F(k)≥2s(l)[s(j)−s(k)]∧F(i)−F(j)≥2s(l)[s(i)−s(j)]F(i)−F(k)≥2s(l)[s(i)−s(k)]F(i)−F(k)s(i)−s(k)≥2s(l)
可以发现,一个点只会被扫到Θ(1)次,而凸包上找答案的复杂度是Θ(log),所以总复杂度就是Θ(nlogn)的
四边形不等式
用途
大概是可以把一些Θ(n3)时间填Θ(n2)的表的dp的时间优化到Θ(n2)
定义
如果
∀a≤b<c≤dwa,c+wb,d≤wa,d+wb,c
那么二元函数w被称为满足四边形不等式的
如果
∀L≤l≤R≤rwL,R≤wl,r
那w被称为区间单调的
定义拓展
当且仅当
wi,j+wi+1,j+1≤wi+1,j+wi,j+1
w满足四边形不等式
证明如下:
明天再证
优化方案
对于一个形如fi,j=min{fi,k+fk,j+wi,j},令pi,j表示fi,j最优的决策点
不难证得:若w满足四边形不等式,那么f也满足四边形不等式
那么
pi,j−1≤pi,j≤pi+1,j
利用决策单调性即可将时间优化至Θ(n2)
单调性的证明等我学会了就写
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现