四边形不等式优化dp

一、首先先看一道例题(codeforces 321E)

有一群人要乘船, 一共有k条船, 现在要将n个排好堆的人分进这k条船中, 使得总代价尽可能小
上船的方法如下:
首先第一条船靠岸, 队伍中前 q1 q 1 个人上船
然后第二条船靠岸, 队伍中前 q2 q 2 个人上船
...... . . . . . .
最后第 k k 条船靠岸, 队伍中 qk q k 个人上船
为了保证所有人都有船坐, 要求 q1+q2+...+qk=n q 1 + q 2 + . . . + q k = n 并且 q1,q2,...,qk>0 q 1 , q 2 , . . . , q k > 0
设第 i i 到第 j j 个人乘坐了一条船, 则定义这一条船的代价为 jk=ijt=k+1cost(k,t) ∑ k = i j ∑ t = k + 1 j c o s t ( k , t ) 其中 cost c o s t 数组已知
定义一种乘船方法的代价为, 每一条船的代价之和
求最小可能代价

首先不难想到这道题可以使用dp
dp(i,j) d p ( i , j ) 表示当前考虑了前 i i 个人, 一共使用了 j j 条船的最小代价
转移十分明显: dp(i,j)=mini1k=j1dp(k,j1)+w(k+1,i) d p ( i , j ) = min k = j − 1 i − 1 d p ( k , j − 1 ) + w ( k + 1 , i ) 其中 w(i,j) w ( i , j ) 表示从第i个人到第j个人坐在一条船上的代价
但是, 我们发现这样做复杂度为 O(n2) O ( n 2 ) , 显然会超时
这时候我们就要优化它

优化, 肯定是想减去一些无用的转移
例如, 一共10个人,要坐5艘船, 让每艘船坐2个人, 感觉上就比前4艘船每艘坐1个人, 最后一艘船挤满人要优得多

这时候我们就要用到四边形不等式优化dp啦

二、四边形不等式

如果有一个矩阵 M M ,对于任意 a<b,c<d a < b , c < d ,有 M(a,c)+M(b,d)M(a,d)+M(b,c) M ( a , c ) + M ( b , d ) ≥ M ( a , d ) + M ( b , c ) ,我们就称这个矩阵满足四边形不等式
我们考虑一个简单的问题:如何验证一个矩阵是否满足四边形不等式?
显然有 O(n2m2) O ( n 2 m 2 ) 的算法,但事实上我们可以依靠下面的性质在 O(nm) O ( n m ) 的复杂度内判断:
a<b,c<d,M(a,c)+M(b,d)M(a,d)+M(b,c) ∀ a < b , c < d , M ( a , c ) + M ( b , d ) ≥ M ( a , d ) + M ( b , c )
1an1,1bm1,M(a,b+1)+M(a+1,b)M(a,b)+M(a+1,b+1) ⇔ ∀ 1 ≤ a ≤ n − 1 , 1 ≤ b ≤ m − 1 , M ( a , b + 1 ) + M ( a + 1 , b ) ≥ M ( a , b ) + M ( a + 1 , b + 1 )
从左边推到右边是显然的,只要令 a=a,b=a+1,c=b,d=b+1 a = a , b = a + 1 , c = b , d = b + 1 就好
从右边推到左边,我们可以把第 a a 行到第 b b 行,第 c c 列到第 d d 列内的所有等式左边相加,右边相加,抵消一下,右边就能推到左边

三、决策单调性

对于一个矩阵 M M ,如果对于任意 a<b,c<d a < b , c < d ,如果 M(a,c)M(a,d) M ( a , c ) ≥ M ( a , d ) ,也满足 M(b,c)M(b,d) M ( b , c ) ≥ M ( b , d ) ,就称这个矩阵具有完全单调性

事实上, 假如一个矩阵满足四边形不等式, 它就满足决策单调性

证明: 我们考虑反证法
假如 a<b,c<d ∃ a < b , c < d , 满足 M(a,c)M(a,d),M(b,c)<M(b,d) M ( a , c ) ≥ M ( a , d ) , M ( b , c ) < M ( b , d )
我们可以发现 M(a,d)+M(b,c)<M(a,c)+M(b,d) M ( a , d ) + M ( b , c ) < M ( a , c ) + M ( b , d ) ,与四边形不等式矛盾
证毕

四、如何优化(实战价值)

我们仍然考虑一个矩阵

f(i) f ( i ) 为矩阵 M M i i 行的最小值的位置,即 M(i,f(i))=minmj=1M(i,j) M ( i , f ( i ) ) = m i n j = 1 m M ( i , j ) ,试证明:对于 a<bf(a)f(b) ∀ a < b , 有 f ( a ) ≤ f ( b )
证明:考虑反证法
如果 a<b使f(a)>f(b) ∃ a < b , 使 得 f ( a ) > f ( b )
因为矩阵 M M 满足四边形不等式,所以M具有完全单调性
对于第 a a 行,由 f(i) f ( i ) 的定义我们有 M(a,f(b))>M(a,f(a)) M ( a , f ( b ) ) > M ( a , f ( a ) )
根据完全单调性,我们有 M(b,f(b))>M(b,f(a)) M ( b , f ( b ) ) > M ( b , f ( a ) ) ,所以 M(b,f(b))b M ( b , f ( b ) ) 不 是 第 b 行的最小值,矛盾
证毕

那么, 该如何求 f(i) f ( i )

首先, 有显然的 O(nm) O ( n m ) 的做法, 把矩阵扫一遍就可以了
但是, 这显然不够好, 下面我们使用分治解决这个问题

我们设计 solve(hl,hr,cl,cr) s o l v e ( h l , h r , c l , c r ) , 这个函数能帮我们算出第 hl h l 到第 hr h r 行的每一行在第 cl c l 到第 cr c r 列之间的最小值的位置
那么我们显然希望完成 solve(1,n,1,n) s o l v e ( 1 , n , 1 , n )
对于 solve(hl,hr,cl,cr) s o l v e ( h l , h r , c l , c r ) ,我们取中间的一行 mid=(hl+hr)/2 m i d = ( h l + h r ) / 2 ,对这行从 cl c l cr c r 扫一遍求出最小值的位置,设它是 pos p o s ,由上面的性质可得,第 hl h l 到第 mid1 m i d − 1 行的最小值一定在第 cl c l 到第 pos p o s 列之间,第 mid+1 m i d + 1 到第 hr h r 行的最小值一定在第 pos p o s 到第 cr c r 列之间
所以我们递归的调用 solve(hl,mid1,cl,pos) s o l v e ( h l , m i d − 1 , c l , p o s ) solve(mid+1,hr,pos,cr) s o l v e ( m i d + 1 , h r , p o s , c r )
就好了
我们来考虑这个算法的复杂度,它的复杂度分析方法很像整体二分的分析方法
第一,每次调用 solve s o l v e 函数, hrhl h r − h l 的大小一定会折半,所以只要递归 logn l o g n 层就会到底
第二,我们考虑 hrhl h r − h l 的值相同的那些函数(由于二分的原因相差1的那些层也算,也就是在递归中在同一层的那些函数),这些函数的 crcl c r − c l 的和是 m m ,所以做每一层的复杂度是 O(m) O ( m ) 的,所以总复杂度 O(mlogn) O ( m l o g n )

你可能感兴趣的:(学习笔记)