决策单调性学习笔记
决策单调性
决策单调性是一种优化动态规划的方法,其思想就是对于满足决策点的位置存在单调性的转移方程,根据这一个性质对其进行优化。
首先设
四边形不等式
- 若对于满足
的任意 ,都有(若要求最大值,则符号相反):
包含单调性
- 对于任意满足
的 ,都有:
如果一个
的证明
假设存在
由于
由于代价函数满足四边形不等式,并且此时有
两式相加得:
此时可以发现,用
具体做法
简要题面:
总共有
分治做法
设
我们暴力枚举所有的转移点用来更新
由于满足决策单调性,因此
递归的层数显然最多为
int mid,up,pos;
inline void Solve(int l,int r,int L,int R) {
if(l>r) return ;
if(L==R) {
for(int i=l;i<=r;i++) f[i]=Calc(L,i);
return ;
}
mid=l+r>>1; up=min(mid-1,R);
f[mid]=Calc(L,mid); pos=L;
for(int i=L+1,val;i<=up;i++)
if((val=Calc(i,mid))<f[mid]) f[mid]=val, pos=i;
Solve(l,mid-1,L,pos); Solve(mid+1,r,pos,R);
}
二分栈做法
维护一个形如
考虑这个序列的具体含义:
F[1]、F[2] 由 F[0] 转移而来
F[3]、F[4]、F[5] 由 F[1] 转移而来
F[6] 由 F[2] 转移而来
F[7]、F[8] 由 F[3] 转移而来
.......
具体实现我们维护一个单调栈。对于栈中的每一个二元组
- 更新答案
那么假设此时要更新
- 更新单调栈
依次检查栈顶的元素
弹到不能再弹为止,对于栈顶的元素
inline int Get(int x,int y,int l) {
int r=n;
while(l<=r)
if(Calc(y,mid)>Calc(x,mid)) l=mid+1;
else r=mid-1;
return l;
}
inline void DP(int id) {
sta[topf=bt=1]=data{id-1,id};
for(int i=id,p;i<=n;i++) {
p=topf;
while(p>bt && sta[p].p>i) --p;
bt=p;
f[i]=Calc(sta[p].x,i);
while(topf>=bt && P>i && Calc(X,P)>=Calc(i,P)) --topf;
if(topf<bt) sta[++topf]=data{i,i+1};
else { now=data{i,Get(X,i,max(P+1,i+1))}; if(now.p<=n) sta[++topf]=now; }
}
}
的转移
记
由于满足决策单调性,因此:
直接根据这个限制枚举范围即可。
f[0][0]=0;
for(int i=1;i<=k;i++) {
p[n+1][i]=n;
for(int j=n;j>=1;j--)
for(int k=p[j][i-1];k<=p[j+1][i];k++) {
int w=calc(k,j);
if(f[k][i-1]+w<f[j][i]) f[j][i]=f[k][i-1]+w, p[j][i]=k;
}
}
待更。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!