四边形不等式
我也不知道我为啥整这玩意
以下内容来自pl_er的讲课:
决策单调性优化
对于转移
令
若有对于任意
容易发现决策单调性具有的性质,决策点单调不减。
如何判断是否满足决策单调性
最常见的方法是证明
可以联想四边形记忆。
下面给出证明
接下来我们考虑如何利用决策单调性优化
介绍两种方法,分治法和二分栈
先介绍分治法,分治利用的是决策点的单调性,一般认为有两种情况:
转移来自"上层",
转移来自"本层",
对于来自上层的处理,我们直接分治处理就可以了。
来自题目
int w(int l,int r){
return dp[now-1][l]+(a[r]-a[l])*(a[r]-a[l]);
}
void solve(int l,int r,int L,int R){
if(l>r) return;
int mid=(l+r)/2;
int p=L,nw=1e9;
for(int i=L;i<=R;i++){
int tmp=w(i,mid);
if(tmp<nw) p=i,nw=tmp;
}
dp[now][mid]=nw;
solve(l,mid-1,L,p);
solve(mid+1,r,p,R);
}
memset(dp,0x3f,sizeof(dp));
dp[0][0]=0;
for(int i=1;i<=m;i++){
now=i;
solve(1,n,0,n-1);
}
printf("%lld",1ll*dp[m][n]*m-1ll*a[n]*a[n]);
对于来自本层的,我们还需要再嵌套一层分治,且用到定义。
来自题目玩具装箱
void Div(int l,int r,int L,int R){
if(l>r) return;
int mid=(l+r)/2;
int p=L;
long long nw=1e18;
for(int i=L;i<=R;i++){
long long tmp=zy(i,mid);
if(tmp<nw) nw=tmp,p=i;
}
dp[mid]=min(nw,dp[mid]);
Div(l,mid-1,L,p);
Div(mid+1,r,p,R);
}
void solve(int l,int r){
if(l==r) return;
int mid=(l+r)/2;
solve(l,mid);
Div(mid+1,r,l,mid);
solve(mid+1,r);
}
memset(dp,0x3f,sizeof(dp));
dp[0]=0;
solve(0,n);
二分栈方法,用的是原定义,不需要区分
来自题目玩具装箱
int head=1,tail=0;
qu[++tail]=Node(0,1,n);
for(int i=1;i<=n;i++){
while(qu[head].r<i) head++;
dp[i]=zy(qu[head].x,i);
while(head<=tail&&zy(qu[tail].x,qu[tail].l)>=zy(i,qu[tail].l)) tail--;
if(head>tail){
qu[++tail]=Node(i,i+1,n);
continue;
}
int l=max(qu[tail].l,i+1),r=qu[tail].r;
while(l<=r){
int mid=(l+r)/2;
if(zy(qu[tail].x,mid)>=zy(i,mid)) r=mid-1;
else l=mid+1;
}
qu[tail].r=r;
if(l<=n) qu[++tail]=Node(i,l,n);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具