决策单调性
什么是决策单调性
假设我有一个状态转移方程 fi=minj=1i−1{fj+w(i,j)}f_i=\min_{j=1}^{i-1}\{f_j+w(i,j)\}fi=minj=1i−1{fj+w(i,j)},其中 w(i,j)w(i,j)w(i,j) 表示代价,那么我们称 minj=1i−1{fi+w(i,j)}\min_{j=1}^{i-1}\{f_i+w(i,j)\}minj=1i−1{fi+w(i,j)} 取最小值时的 jjj 为最优决策点。我们记 pip_ipi 表示 fif_ifi 的最优决策点,那么决策单调性就是指:
如果随着 iii 单调递增,pip_ipi 总是单调不递降的,那么我们就称这种性质为决策单调性。
注意:决策单调性是一种性质,不是一种定理,因此你只能认为一个东西具有决策单调性,而不能证明决策单调性本身是对的。这里可能有点绕,不过多想想应该能想明白。
那决策单调性有什么用呢?它可以用来优化 DP 转移。
决策单调性优化 DP
假如我们知道了一个 DP 转移具有决策单调性,那么这一点就会提醒我们每次在上一次转移的最优决策点的后面找当前位置的最优决策点。不过每次找一遍似乎效率太低了,我们有没有什么有效的办法能优化它?
其实不难发现一个点:有些位置的 DP 转移用到的最优决策点是一样的。那我们可不可以把最优决策点相同的位置合并在一起,形成一个大的整块呢?
因此我们可以使用一个双端队列,它存的每一个东西是 {l,r,p}\{l,r,p\}{l,r,p} 这样一个三元组,表示的是 [l,r][l,r][l,r] 这样一个区间里的所有位置的最优决策点都是 ppp。
现在,我们思考这样一个事:你到了一个点 iii,并且队列里面有很多这样的三元组,现在你要转移 fif_ifi,该怎么做?步骤如下:
- 首先判断队首是否包含你,如果包含,那么就可以用队首的最优决策点转移,反之弹出队首。
- 其次直接用队首的最优决策点转移。
- 然后考虑队尾的块能否用当前位置转移,如果用当前位置转移更优,那么直接弹出队尾,反之先不动。
- 取出当前队尾,然后二分这个块的分割点,把分割点之后的部分组成一个新的整块,并且最优决策点是 iii。
- 重复执行以上操作,直到转移结束。
我来一步一步详细讲解一下。
首先考虑你是否被队首包含,如果没被包含,那么此时队首的最优决策点肯定对你以及你之后的点无效,直接弹出即可。
while(l<r&&rgt[q[l]]<i)
{
l++;
}
注:rgt[q[l]] 表示当前队首保存的右端点。
然后就可以直接用当前队首的最优决策点转移,因为我们已经保证了当前的最优决策点是最优的。
f[i]=calc(q[l],i);
注:这个 calc 函数是转移的函数。
接下来就是最重要的一步:如果说你的队尾的整块里的所有位置取原本的最优决策点比取当前这个点为最优决策点更劣,那么这个块当前的最优决策点一定不是最优的,所以直接弹出。
这里说一下如何判断这一整块里的所有位置取当前点是否都更优:因为我们知道这个 DP 转移具有决策单调性,那么如果这一整块的左端点取当前位置都更优,那么后面的点肯定取当前点都更优。
while(l<r&&calc(q[r-1],lft[q[r-1]])>=calc(i,lft[q[r-1]]))
{
r--;
}
注:lft[q[r-1]] 表示队尾的左端点,q[r-1] 表示队尾的最优决策点。这里我直接把所有信息保存在了最优决策点上。
最后就是拆块。因为虽然我当前队尾的左端点取原本的最优决策点更优,但不代表这一整个块中的所有点取原本的最优决策点都更优,于是我们需要二分找出一个 pos 使得 [l,pos−1][l,pos-1][l,pos−1] 取原本的最优决策点更优,[pos,n][pos,n][pos,n] 取当前位置为最优决策点更优。
这里说一下为什么能二分:还是因为决策单调性。如果说我当前二分到的 mid 取原本的最优决策点更优,那么在它之前的点取原本的最优决策点肯定都更优。反之它左边的点取当前点为最优决策点肯定都更优。所以可以直接二分。
int ll=lft[q[r-1]],rr=n+1,mid,pos;
while(ll<=rr)
{
mid=ll+rr>>1;
if(calc(q[r-1],mid)>=calc(i,mid))
{
pos=mid;
rr=mid-1;
}
else
{
ll=mid+1;
}
}
最后二分完了之后更新当前块的状态:
if(ll>n)//如果当前位置不可能成为最优决策点
{
continue;
}
rgt[q[r-1]]=pos-1;
q[r]=i;
r++;
lft[i]=pos,rgt[i]=n;
四边形不等式
讲完决策单调性优化 DP,你可能会有一个疑惑:我们如何判断一个 DP 转移是否具有决策单调性?这个就需要用到四边形不等式了。
什么是四边形不等式
四边形不等式,原本是用于数学上的一个概念,具体是这么说的:
在平面内的任意一个四边形 ABCDABCDABCD 一定满足 AC+BD≥AD+BCAC+BD\ge AD+BCAC+BD≥AD+BC。
就是说:两条对角线的长度和一定不小于两条对边的长度和。
在信息里,我们称满足 ∀a≤b≤c≤d,w(a,d)+w(b,c)≥w(a,c)+w(b,d)\forall a\le b\le c\le d,w(a,d)+w(b,c)\ge w(a,c)+w(b,d)∀a≤b≤c≤d,w(a,d)+w(b,c)≥w(a,c)+w(b,d) 的函数 www 满足四边形不等式,简记为“交叉小于包含”。
有了四边形不等式,我们就可以提出第一条定理:
如果一个 DP 转移方程 fi=min{fj+w(i,j)}f_i=\min\{f_j+w(i,j)\}fi=min{fj+w(i,j)} 中的成本函数 www 满足四边形不等式,那么这个 DP 转移一定满足决策单调性。
证明如下:
设点 iii 的最优决策点为 pip_ipi,那么有:
∀j∈[1,pi−1],fj+w(i,j)≥fpi+w(i,pi) (1)\forall j\isin[1,p_i-1],f_j+w(i,j)\ge f_{p_i}+w(i,p_i)\ \ \ \ \ \ \ \ \ \ (1)∀j∈[1,pi−1],fj+w(i,j)≥fpi+w(i,pi) (1)
假设我们下次要转移的点为 i′≥ii'\ge ii′≥i,那么我们有不等式:
j≤pi≤i≤i′j\le p_i\le i\le i'j≤pi≤i≤i′
于是它们满足四边形不等式:
w(j,i)+w(pi,i′)≤w(j,i′)+w(pi,i) (2)w(j,i)+w(p_i,i')\le w(j,i')+w(p_i,i)\ \ \ \ \ \ \ \ \ \ (2)w(j,i)+w(pi,i′)≤w(j,i′)+w(pi,i) (2)
把 (1)(1)(1) 式和 (2)(2)(2) 式合在一起得到:
fj+w(i,j)+w(j,i′)+w(pi,i)≥fpi+w(i,pi)+w(j,i)+w(pi,i′)f_j+w(i,j)+w(j,i')+w(p_i,i)\ge f_{p_i}+w(i,p_i)+w(j,i)+w(p_i,i')fj+w(i,j)+w(j,i′)+w(pi,i)≥fpi+w(i,pi)+w(j,i)+w(pi,i′)
把左右相同的部分消去得到(注意:w(x,y)=w(y,x)w(x,y)=w(y,x)w(x,y)=w(y,x)):
fj+w(j,i′)≥fpi+w(pi,i′)f_j+w(j,i')\ge f_{p_i}+w(p_i,i')fj+w(j,i′)≥fpi+w(pi,i′)
也就是说:任意的 j<pij\lt p_ij<pi,通过 jjj 转移到 i′i'i′ 一定比通过 pip_ipi 转移到 i′i'i′ 更劣。所以说 pip_ipi 之前的位置都不可能是 fi′f_{i'}fi′ 的最优决策点,因此证得 fif_ifi 一定具有决策单调性。得证。
既然知道了这个 DP 转移具有决策单调性,那么我们就可以使用决策单调性优化 DP,所以四边形不等式优化 DP 的本质还是决策单调性优化 DP。
现在我们考虑如何方便快速的证明四边形不等式:
若 ∀i<i+1≤j<j+1,w(i,j)+w(i+1,j+1)≤w(i,j+1)+w(i+1,j)\forall i\lt i+1\le j\lt j+1,w(i,j)+w(i+1,j+1)\le w(i,j+1)+w(i+1,j)∀i<i+1≤j<j+1,w(i,j)+w(i+1,j+1)≤w(i,j+1)+w(i+1,j),那么函数 www 满足四边形不等式。
我们来证明一下,采用归纳法证明:
设 d=j−id=j-id=j−i,则:
取 i′=i+1<ji'=i+1\lt ji′=i+1<j,则可以得到:
i′<i′+1≤j≤j+1i'\lt i'+1\le j\le j+1i′<i′+1≤j≤j+1
把 i′i'i′ 当做 iii 带入原式子中得到:
w(i+1,j)+w(i+2,j+1)≤w(i+1,j+1)+w(i+2,j)w(i+1,j)+w(i+2,j+1)\le w(i+1,j+1)+w(i+2,j)w(i+1,j)+w(i+2,j+1)≤w(i+1,j+1)+w(i+2,j)
把上述式子和原式子合并得到:
w(i+1,j)+w(i+2,j+1)+w(i,j)+w(i+1,j+1)≤w(i+1,j+1)+w(i+2,j)+w(i,j+1)+w(i+1,j)w(i+1,j)+w(i+2,j+1)+w(i,j)+w(i+1,j+1)\le w(i+1,j+1)+w(i+2,j)+w(i,j+1)+w(i+1,j)w(i+1,j)+w(i+2,j+1)+w(i,j)+w(i+1,j+1)≤w(i+1,j+1)+w(i+2,j)+w(i,j+1)+w(i+1,j)
还是左右相消得到:
w(i+2,j+1)+w(i,j)≤w(i,j+1)+w(i+2,j)w(i+2,j+1)+w(i,j)\le w(i,j+1)+w(i+2,j)w(i+2,j+1)+w(i,j)≤w(i,j+1)+w(i+2,j)
所以我们可以得到:
∀i<i+2≤j<j+1,w(i+2,j+1)+w(i,j)≤w(i,j+1)+w(i+2,j)\forall i\lt i+2\le j\lt j+1,w(i+2,j+1)+w(i,j)\le w(i,j+1)+w(i+2,j)∀i<i+2≤j<j+1,w(i+2,j+1)+w(i,j)≤w(i,j+1)+w(i+2,j)
也就是说:i,i+2,j,j+1i,i+2,j,j+1i,i+2,j,j+1 也满足四边形不等式。
那么我们可以令 i′=i+3,i+4,…,i+d−1i'=i+3,i+4,\dots,i+d-1i′=i+3,i+4,…,i+d−1,均满足该不等式,于是可以得到:
∀i<i′≤j<j+1,w(i,j)+w(i′,j+1)≤w(i,j+1)+w(i′,j)\forall i\lt i'\le j\lt j+1,w(i,j)+w(i',j+1)\le w(i,j+1)+w(i',j)∀i<i′≤j<j+1,w(i,j)+w(i′,j+1)≤w(i,j+1)+w(i′,j)
现在我们把 jjj 取为 j+1,j+2,…j+1,j+2,\dotsj+1,j+2,…,通过运算仍然能得到上面的不等式,于是我们可以得到:
∀i<i′≤j<j′,w(i,j)+w(i′,j′)≤w(i,j′)+w(i′,j)\forall i\lt i'\le j\lt j',w(i,j)+w(i',j')\le w(i,j')+w(i',j)∀i<i′≤j<j′,w(i,j)+w(i′,j′)≤w(i,j′)+w(i′,j)
所以函数 www 满足四边形不等式。得证。
四边形不等式对二维 DP 的优化
对于区间 DP,四边形不等式也能很好的优化它。
我们先写出区间 DP 的经典转移方程:
fi,j=min{fi,k+fk+1,j+w(i,j)}f_{i,j}=\min\{f_{i,k}+f_{k+1,j}+w(i,j)\}fi,j=min{fi,k+fk+1,j+w(i,j)}
如果说成本函数 www 满足四边形不等式,那么我们同样可以得出 fff 满足决策单调性。设 pi,jp_{i,j}pi,j 表示 fi,jf_{i,j}fi,j 的最优决策点,那么我们还可以得到:
pi,j−1≤pi,j≤pi+1,jp_{i,j-1}\le p_{i,j}\le p_{i+1,j}pi,j−1≤pi,j≤pi+1,j
具体证明比较复杂,一般我们会直接把它当做结论来记,对证明感兴趣的同学可以参考《算法竞赛(上册)》中关于四边形不等式优化区间 DP 的证明的讲解。
477

被折叠的 条评论
为什么被折叠?



