Mincowski-Sum 闵可夫斯基和优化 DP
更新日志
2025/07/07:开工。思路
闵可夫斯基和可以用于优化 Max-Add 及 Min-Add 卷积。下文以 Max-Add 卷积为例进行讲解。
Max-Add 卷积形似 \(f_i=\max\limits_{j=0}^i g_j+h_{i-j}\),要求 \(h,g\) 均具有凸性,对于 Max-Add 卷积,要求它们上凸,Min-Add 卷积同理要求下凸。
考虑处理出 \(h,g\) 的差分数组,则由于上凸性它们单降。那么原要求等价于在 \(g\) 中选出最大的 \(j\) 个差分和 \(h\) 中最大的 \(i-j\) 个差分来得到 \(f_i\)(差不多这个意思,并不是特别精确,详见代码)。贪心一下即可。由于它们本就单降,所以只需要 \(O(n)\) 归并排序即可。
模板
inline vec<ll> mincowski(vec<ll> a,vec<ll> b){
per(i,a.size()-1,1)a[i]-=a[i-1];
per(i,b.size()-1,1)b[i]-=b[i-1];
vec<ll> c(a.size()+b.size()-1);
merge(a.begin()+1,a.end(),b.begin()+1,b.end(),c.begin()+1);
c[0]=a[0]+b[0];
repl(i,1,c.size())c[i]+=c[i-1];
return c;
}
优化 DP
如果 DP 值具有凸性且支持区间合并,使用类 Max-Add 卷积转移,那么就可以分治,然后闵可夫斯基和合并,总层数是 \(\log n\) 级别的,每一层可以 \(O(n)\) 解决,总复杂度 \(O(n\log n)\)。
例题
注意代码中我把多项式加法重载为取 \(\min\) 操作了,问就是懒得改。。
code
const int L=3,N=3e5+5;
int len,n;
string s;
ll c[N],b[N];
struct node{
vec<ll> v[L][L];
node(){rep(i,0,2)rep(j,0,2)v[i][j].resize(1,0);}
};
inline void operator+=(vec<ll> &a,const vec<ll> &b){
if(a.size()<b.size())a.resize(b.size(),INF);
repl(i,0,b.size())chmin(a[i],b[i]);
}
inline vec<ll> mincowski(vec<ll> a,vec<ll> b){
per(i,a.size()-1,1)a[i]-=a[i-1];
per(i,b.size()-1,1)b[i]-=b[i-1];
vec<ll> c(a.size()+b.size()-1);
merge(a.begin()+1,a.end(),b.begin()+1,b.end(),c.begin()+1);
c[0]=a[0]+b[0];
repl(i,1,c.size())c[i]+=c[i-1];
return c;
}
node solve(int l,int r){
node res;
if(r-l+1<(len<<1)){
rep(i,0,r-l+1-len)res.v[i][r-(l+i+len-1)].resize(2,b[l+i]);
}else{
int m=l+r>>1;
node lres=solve(l,m),rres=solve(m+1,r);
repl(lf,0,len)repl(rt,0,len){
res.v[lf][rt]+=mincowski(lres.v[lf][0],rres.v[0][rt]);
rep(k,1,len-1)res.v[lf][rt]+=mincowski(mincowski(lres.v[lf][k],rres.v[len-k][rt]),{0,b[m-k+1]});
}
}
per(i,len-1,1)repl(j,0,len)res.v[i-1][j]+=res.v[i][j];
per(j,len-1,1)repl(i,0,len)res.v[i][j-1]+=res.v[i][j];
return res;
}
inline void Main(){
read(len,n,s);s=" "+s;
rep(i,1,n)read(c[i]);
rep(i,1,n-len+1){
b[i]=(s[i]!='M')*c[i];
repl(j,1,len)b[i]+=(s[i+j]!='O')*c[i+j];
}
auto f=solve(1,n);
rep(k,1,n/len)put(f.v[0][0][k]);
}

浙公网安备 33010602011771号