基本DP优化

DP优化

斜率优化

f(i)=max{f(j)+(s(i)s(j))2}n106.

其中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<kF(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)

定义

如果

ab<cdwa,c+wb,dwa,d+wb,c

那么二元函数w被称为满足四边形不等式的

如果

LlRrwL,Rwl,r

w被称为区间单调的

定义拓展

当且仅当

wi,j+wi+1,j+1wi+1,j+wi,j+1

w满足四边形不等式

证明如下:

明天再证

优化方案

对于一个形如fi,j=min{fi,k+fk,j+wi,j},令pi,j表示fi,j最优的决策点

不难证得:若w满足四边形不等式,那么f也满足四边形不等式

那么

pi,j1pi,jpi+1,j

利用决策单调性即可将时间优化至Θ(n2)

单调性的证明等我学会了就写

posted @   嘉年华_efX  阅读(708)  评论(2编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示

目录导航