《杨哲凸完全单调性的一个加强与应用.ppt》由会员分享,可在线阅读,更多相关《杨哲凸完全单调性的一个加强与应用.ppt(41页珍藏版)》请在三一办公上搜索。
1、凸完全单调性的一个加强与应用,西安市第一中学杨哲,四边形不等式、凸完全单调性与决策单调性以及凸完全单调性的一个加强,第一部分,四边形不等式、凸完全单调性与决策单调性,对于一个权函数w(i,j),如果它满足w(x,i+1)-w(x,i)随x单调不增,亦即w(x,i+1)+w(x+1,i)w(x,i)+w(x+1,i+1),则称这个权函数满足凸完全单调性。容易证明,当k 0 时,w(x,i+k)-w(x,i)随x单调不减,w(i+k,x)-w(i,x)随x单调不减。所以对任意的a b c d,有w(a,d)+w(b,c)w(a,c)+w(b,d)。称此不等式为四边形不等式。由四边形不等式也可推出凸
2、完全单调性,所以“w 满足四边形不等式”与“w具有凸完全单调性”这两种说法是等价的。,四边形不等式、凸完全单调性与决策单调性,在一类要求将一段序列划分为若干子段,从i到j的一段的费用为w(i,j),要求出所有子段代价之和最小的划分方案的动态规划问题中,通常可以见到这样的状态转移方程:设t(i,x)=fi+w(i,x),如果对于某个x,t(i,x)t(j,x)(i x,有t(i,y)t(j,y)。此式说明,对于i j,一旦某个时刻决策i没有决策j好,以后决策i也不会比决策j好。这说明,fx 的决策是随x单调不减的,这就是决策的单调性。,四边形不等式、凸完全单调性与决策单调性,解决这类问题时,通常
3、用Bi记录使决策i比所有之前的决策j(j i)要好的最小的x,即Bi=minx:t(i,x)t(j,x)对所有j i均成立。根据决策的单调性,决策i比所有之前的决策j(j i)要好等价于Bi x。如果对某个(i,j)(i j),Bi Bj,则说明决策i是无用的。于是任何时刻,假设所有有用决策为 i1,i2,ik,满足i1 i2 ik,则Bi1 Bi2 Bik。,四边形不等式、凸完全单调性与决策单调性,求解fx时,如果j=maxj:Bij x,j k,则此时决策ij一定是最好的,即fx=t(ij,x)。利用决策的单调性,这个j可以接着上次查找,所以n次找j的时间复杂度为O(n+决策序列长度)=O
4、(n)。在求出了fx 之后,x将成为一个有用决策,我们需要求出Bx,以及维护这个决策序列。,四边形不等式、凸完全单调性与决策单调性,假设可以在T单位时间内求出y=miny:t(x,y)Bik。此时,Bx=y(因为不可能再小),并且x应当被添加到这个决策序列的末尾。容易发现,用栈可以很好的完成这个序列的维护,由于每个决策至多进出栈一次,每个决策出栈至多消耗T单位时间,于是维护序列的时间复杂度是O(nT)。又因为决策的单调性,查找合适决策的时间复杂度是O(n)的,所以总的时间复杂度是O(nT)。,四边形不等式、凸完全单调性与决策单调性,有时,因为函数w的表达式便于求出miny:t(x,y)t(ik
5、,y),所以T=O(1);一般情况下,根据w的凸性可以得到t(x,y)-t(ik,y)关于y单调不增,于是可以在O(log n)时间内用二分的方法求出y,此时T=O(log n)。所以如果函数w是凸的,那么这种动态规划问题最坏可以在O(nlogn)时间内求解;最好时,可以在O(n)时间内求解,可见这种方法是非常高效的。然而,此种动态规划模型单一,对w的限制有时又难以满足,所以应用范围也较为狭窄。但其思想是值得借鉴的。,凸完全单调性的一个加强,假设我们要维护一个广义(不局限于动态规划问题)决策序列i1,i2,ik,满足i1 i2 ik,存在函数g和h,满足在选取有关x的最优决策时,决策i不如决策
6、j(i j)等价于g(i,j)h(x)。此时,决策仍然具有单调性,不过这不是关于x单调,而是关于h(x)单调。类比上面的知识,容易知道,这里维护的决策序列满足为了方便,我们记i0=nil。则g(ik-1,ik)g(ik,ik+1)。,凸完全单调性的一个加强,我们需要在这个序列上进行查找最小的j,满足h(x)g(ij,ij+1)。还需要在适当的时候添加一个候选决策。函数g,h的出现,使这个方法有了更大的弹性,所以这个决策序列的维护方法也多种多样,这些维护方法将在下一节中讨论。在第一节介绍的w凸的一类动态规划问题中,让h(x)=x,容易证明g(ik-1,ik)=Bik,此方法就退化为第一节所讲方法
7、。所以,利用凸完全单调性维护决策只是本方法的一个特例。,对此加强的进一步分析,第二部分,选取适当的h(x)加速算法,例1(CEOI2004 Two Sawmills)在一座山上分布着N(2 N 10000)棵树,由高到低依次编号为1,2,.,N。在山脚处还有一个伐木场。这N 棵树要被运往伐木场进行生产。每棵树只能从高处运往低处,而且这些树都分布在一条路旁。第i棵树的重量为Wi,它距离最山脚处的伐木场的距离为Pi。运送每棵树的代价为它的重量与它到伐木场的距离的乘积。总代价为运送每棵树的代价之和。伐木场的领导为了降低成本,决定在这条路旁的某两个位置再建两个伐木场。每棵树被运往不在它上方且离它最近的
8、伐木场。现在要确定这两个新伐木场的位置,使得新的总代价最小,要求输出最小总代价。,选取适当的h(x)加速算法,我们直接解决新建k个伐木场的问题。设,dk,i表示从i到n建造k个伐木场的最小总代价。则本题的答案就是dk,1。由于dk 只与dk 1 有关,我们根据k 来划分阶段。假设Ui=dk 1,i Ti+Pi1Si,则,选取适当的h(x)加速算法,容易发现,这里的权函数是凸的,但是直接利用第一节的方法只能得到O(kn log n)的算法。利用第二节的方法可得,在计算dk,x时所以令,h(x)=Sx。假设此时的决策序列为i1,i2,ik,i1 i2 il,g(i0,i1)g(i1,i2)g(il
9、1,il)。,选取适当的h(x)加速算法,在计算dk,x时,需要找到最小的j,满足g(ij,ij+1)Sx,则。由于Sx在的计算过程中是单调增的(按照x从大到小的顺序计算),我们只需要接着上次向后查找,于是这n次查找的总时间复杂度为O(n)。计算出dk之后,我们需要建立一个决策序列供下一阶段选择。我们按照从大到小的顺序将这些候选决策加入决策序列。假设某个时刻决策序列为i1,i2,ik,i1 i2 il,此时要将x(il x)添加到决策序列中。我们比较g(il1,il)与g(il,x)的大小,如果g(il,x)g(il1,il),就删去决策il(令l l 1),继续这样的比较直到g(il1,il
10、)g(il,x),最后再将x 放到决策序列的末尾。,选取适当的h(x)加速算法,容易看出,这是一个栈维护的问题。因为g的计算是O(1)的,所以整个过程的时间复杂度是O(n)。综上,每个阶段的计算是O(n)的,一共有k个阶段,故总的时间复杂度为O(kn)。对比这个方法与直接利用凸完全单调性的方法可以发现,直接利用凸完全单调性的方法实际上是在求出了g(i,j)之后,用二分的方法求出了最小的满足g(i,j)Sx的x。而这是完全没有必要的。如果w 本身是凸的,通过选择合适的h(x)(这里h(x)=Sx),那么这个h(x)与x一定具有相同的单调性,这不会影响查找的总时间,而计算g的复杂度由O(log n
11、)降到了O(1),这就将维护决策序列时间复杂度从O(n log n)降到了O(n),从而提高的算法的效率。,用于解决一些权函数不具有凸完全单调性的问题,在刚才的例题中,这个方法只是扮演着优化的角色,并没有质的改变。下面,我们将利用这个方法解决一个权函数不满足四边形不等式的题目。例2(石阶)水平面上有个高度为h 的高台,你需要用n(n 1000)块石块修建一个石阶,从这个高台通往地面。第i 个石阶的高度为hi。由于一些限制,你从高台出发,并且只能顺次处理每块石块,你要么将当前的石块摞在你前方的那一列,要么走到前方的那一列。在修建石阶的过程中你不能向回走。为了让这个石阶不至于太单调,你希望这个石阶
12、有所起伏,所以你希望将这n个石块都用上。为了让这个石阶安全可用,你希望相邻两列高度之差的最大值(视高台为第0列,地面为最后一列)尽可能小。也就是说,你需要将这n个石块分成若干段,假设你将他们分成了k段,则每段的高度为这段所有石块的高度总和。假设第i 段的高度为ti,t0=h,tk+1=0。你的目标就是选择一个合适的分段,来最小化。,用于解决一些权函数不具有凸完全单调性的问题,设h0=h,hn+1=0,dk,x为将石块0到石块x分成若干段,最后一段为石块k到石块x的方案中,相邻两段高度差的最小值。设si=h0+hi,diff i,k,x=|sx 2sk1+si1|,则dn+1,n+1就是所求答案
13、。,用于解决一些权函数不具有凸完全单调性的问题,这里,我们按照k从小到大,x从小到大的顺序计算dk,x。我们需要维护n+1个决策序列,第k个决策序列存储di,k 1,其中i作为决策量。我们考察决策i比决策j更好的条件,以确定决策序列的各决策的序以及维护方法。设h(x)=sx 2sk1,则决策i比决策j(i j)好等价于,用于解决一些权函数不具有凸完全单调性的问题,容易发现,如果h(x)足够大,那么此式一定不成立。我们考察这类不等式的解集。考虑函数f1(x)=max(|x+a1|,b1),f2(x)=max(|x+a2|,b2)。这里a1 a2,但b1、b2 间没有必然的大小关系。则这两个函数间
14、可能有以下几种关系:,用于解决一些权函数不具有凸完全单调性的问题,用于解决一些权函数不具有凸完全单调性的问题,在图中我们可以看到,f1(x)f2(x)的解集一定是x g(a2,b2,a1,b1)。故决策i比决策j(i j)好等价于简写为h(x)g(j,i)。这里g是可以在O(1)时间内求出的。,用于解决一些权函数不具有凸完全单调性的问题,所以我们维护的每个决策序列中的决策应当满足:查找决策时,应当找到最大的j,满足h(x)g(ij1,ij)。因为h(x)=sx 2sk1关于x单调增,我们可以接着上次向前查找,所以总的查找时间为O(n)。维护序列时,由于dk,x是按照k从小到大计算的,新的决策一
15、定是被追加到决策序列的末尾,所以只需要反复比较g(il1,il)与g(il,k),删去序列的末尾决策直到满足g(il1,il)g(il,k),最后将k追加到决策序列的末尾。,用于解决一些权函数不具有凸完全单调性的问题,这样,我们就得到了这个题目的O(n2)时间复杂度的解法。这个题目中,f2(x)-f1(x)并不一定是单调增的,也就是权函数并不具有凸完全单调性,但我们还是利用这个方法解决了这个问题。其原因在于,我们利用的只是决策的单调性,并不需要在意是哪个具体的性质造成的这种单调性。对权函数要求过高,这便是凸完全单调性的局限,为一个不难达到的目的付出了过多的代价。,合理的序与维护方向,上面两个例
16、子,尤其是例2,向我们展示了这种方法的灵活性。动态规划的方程并不像第一节中的那么死板,也并不只有一个决策序列,决策的添加顺序也没有固定的要求。一个决策甚至可以被加入多个决策序列!(但不能太多,否则就与动态规划的本质与维护决策的最终目的背道而驰;当然,在例2中并未出现此情况)然而,解决动态规划问题只是此类方法的一部分,此类方法还可以解决更为宽泛的问题。,合理的序与维护方向,例3(经典问题)要求维护一些不与y轴平行的直线,为了方便,初始时只有一条直线y=。每次要么添加一条直线y=kx+b,要么询问x=k 与这些直线的最低交点的坐标。假设询问的次数为q,直线的条数为n,请给出一个O(n+q)log
17、n)的算法。假设第i条直线为y=kix+bi。考虑何时直线i不如直线j好。显然,这等价于 但由于ki-kj的正负不确定,所以无法继续变形下去。,合理的序与维护方向,回顾决策序列的维护过程,可以发现,此方法并没有对决策的顺序作任何显式的要求,只要求决策满足:回顾前两个例题可以发现,决策的顺序恰恰是暗含在函数g中的。,合理的序与维护方向,在本题中为了得到g(i,j)h(x),我们可以要求ki kj。这样就得到了一个合适的序。有了这个序,我们就可以得到:即h(x)=x,,合理的序与维护方向,假如我们维护了一个决策序列i1,i2,il,满足ki_1 ki_2 ki_l,-=g(nil,ki_1)g(k
18、i_1,ki_2)g(ki_(l-1),ki_l)回答询问时,只要在这个序列中找最大的j,满足g(ij-1,ij)x。则所求交点一定在直线ij上。插入新直线时,由于这条直线并不一定是斜率最小的直线,所以我们不能在决策序列的末尾添加这个决策,而是要根据这条直线的斜率来决定是在开头还是中间还是末尾来维护这个序列。为了使算法描述尽可能地简洁,我们视序列的开头和结尾为一种退化了的中间。假设ki_j kn ki_(j-1),我们可以用类似栈维护的方法删去前面不需要保留的决策。假设这个时候n前方的决策变成了ij,我们比较g(ij,x)与g(x,ij+1)来判断决策n是否需要保留。如果需要保留,这时有可能g
19、(n,ij+1)g(ij+1,ij+2),那么决策ij+1不需要被保留,删去决策ij+1,再判断决策ij+2是否不需要被保留。如此操作直到不需要删除决策为止。,合理的序与维护方向,容易知道,平衡树可以在O(log n)的时间内求前驱、后继,查找最大的不超过h(x)的元素。因为每次插入新的决策只需要进行均摊O(1)次操作(可用类似于栈维护的方法证明),所以维护序列的总时间是O(nlogn)的。回答询问的总时间是O(qlogn)的。所以总时间复杂度就是O(n+q)logn)的。值得一提的是,只要对这个算法稍加改变,就可以在O(nlogn+输出规模)的时间内解决在线半平面交的问题,因为我们计算出的g
20、恰好就是这些直线组成的最低折线上的转折点。虽然这种方法可以高效处理从中间维护决策序列的情况,但毕竟平衡树操作的常数因子不小,如果可以只在两头维护序列,就只需要用栈来维护,程序效率会大大提高。,合理的序与维护方向,考虑离线半平面交问题,给出n个二元一次方程Ax+By C,求出可行域。我们只考虑这个问题的关键步骤:给出一些直线y=kx+b,求出最低的一条折线(显然这是上凸的)。由于最终的结果与处理直线的顺序无关,我们先将这些直线按照k从大到小排序,然后应用上面的方法。这时,这些“决策”的插入过程中,只需要从序列的尾部维护,这个操作用栈就可以高效的完成。最后剩下的“决策”就是按照从左到右顺序的最低折
21、线,而相邻两“决策”间的g,就是这些折线交点的横坐标。排序之后的这些操作,其时间复杂度总计O(n)。这个几何问题,我们甚至没有画一张图,就用这种方法在O(nlogn)的时间内高效的解决了。而算法效率的瓶颈是一开始的排序,如果排序可以在O(n)时间内完成,或者直线就是按斜率从大到小或斜率从小到大的顺序给出,那么此方法的时间复杂度就是O(n)。这足以说明此方法更应该被作为一种思想来看待。,合理的序与维护方向,例4(USACO JAN07 schul)要求维护一些不与y轴平行的直线。每次要么添加一条直线y=kx+b,要么询问当x=p与这些直线的所有交点中的纵坐标的最小的点。保证每条直线的斜率大于0,
22、并且新加直线的横截距-b/k比原来的直线的横截距都大。并且保证每次询问的p总比最大横截距大。由于直线并不是按照斜率递增或递减的顺序添加的,使用上面的方法只能得到O(n+q)logn)的算法,而对于本题的数据,这个算法虽然比O(qn)的方法快了很多,但还是很慢。我们不妨再仔细分析一下题目特点,按顺序将每条直线假如决策序列会怎样呢?直线i比直线j(i ki时,这等价于;当kj ki时,这等价于,然 而由于左边不大于最大横截距,而这个问题又保证每次询问的x大于最大横截距,所以这个条件等价于 x!,合理的序与维护方向,这样,我们就得到了一个合适的函数g(i,j),以及一个便于处理的序,这个序恰好就是直
23、线插入的顺序。所以这个问题就被转化为一个普通的栈维护问题,由于这个序列的维护方法已经在例2中给出,这里不再赘述。这样,我们就在O(n+q)的时间解决了这个问题。而解决这个问题的关键是:有些结论虽然在全局并不成立,但在某个具有更多限制的局部内却可以满足。所以我们要充分利用题目特点,找到最适合的序,这个序有时就是以这个特殊的局部内的某些性质为基础的。,最优决策的查找方式,当这个决策序列是使用栈在两头维护时:如果h(x)单调增或单调减,则可以利用这个单调性接着上次查找,在O(n+q)时间内回答所有询问,如果这个h(x)的反复次数不多(例如凸等),也可以用接着上次查找的方法,其时间复杂度为O(|ans
24、1-ans2|+|ans1-ans2|+|ansq-1-ansq|)。如果这个h(x)的变化很不规律,则可以用二分查找的方法在O(q log n)时间内回答所有询问。当这个决策序列是从中间维护时,由于使用了平衡树,我们也只能用平衡树上的查找方法。相比之下,从中间维护决策序列无论是从决策的维护还是最优决策的查找,都有很大劣势,我们应当尽量避免(寻找适合的序)。,选择合适的规划方向,例5(旅行)一条铁路线上有N个城市,顺序编号为1,2,N,TT希望从城市1到城市N。从城市i出发只能到达后面的某个点j,需要花费(j-i)Ai的车票费与Bj元的检票费。TT想知道从城市1出发到城市N所需要的最少花费。假
25、设di为从城市1到城市i所需的最小费用,则决策i不比决策j(i j)等价于于是选择Ai作为决策的序,就转化为使用平衡树从中间维护决策序列的问题。根据上面的讨论,这个算法的时间复杂度是O(nlogn)的。但由于使用平衡树来维护,这个算法的常数因子不小。,选择合适的规划方向,但是,如果定义di为从车站i到车站N所花的最少代价,则此时,决策i不如决策j(i j)等价于这时,我们可以按处理顺序在决策序列末尾维护决策,这样只需要用栈就可以维护决策序列。在查找最优决策的时候,只需要使用二分查找的方法,就可以在O(nlogn)时间内解决此问题。虽然这个方法与上个方法具有一样的理论时间复杂度,但由于栈维护和二
26、分查找相对于平衡树的常数因子非常小,在实践中,这个方法相比上个方法存在很大优势。,事先除去无用状态以获得合适的序,在上个问题中,如果令Bi=0,这个题目就可以很容易的用贪心算法解决,其时间复杂度是O(n)的。在这个特殊情况下,能否再进行一些优化来改进这个方法呢?答案是肯定的。考虑这个题的贪心算法:如果当前车站的Ai更小,那么就在这里倒车,直到到达城市N。也就是说,决策序列中的Ai是单调减的。然而,对刚才的方法稍加分析,可以发现,有用的决策并不一定满足这个条件。因为我们计算了大量无用di!这些di不会作为以后的可行决策,但是为了计算它们,我们不得不使用一个更差的决策序列,或者不得不使用一种更差的
27、最优决策的查找方法。,事先除去无用状态以获得合适的序,所以我们要事先知道哪些决策是无用的。假设di是从车站1到车站i的最小花费。且di=dj+(i-j)Aj。则决策i比决策j好等价于于是在这个问题中,任何时候决策序列中实际上只有一个决策,所以这个修改过的动态规划与贪心几乎没有区别了,可谓是殊途同归。,事先除去无用状态以获得合适的序,例6(Balkan OI2003 欧元)将一个由n个数组成的数列划分为若干段,设前i个数的和是si,如果一段是从第i个数到第j个数,那么这段的权值是(sj-si)j-T(T 0),求出一个权和最大的划分。设di为从第1个数到第i个数的权值最大的划分。则决策i不如决策
28、j(i j)价等于由此我们可以确定决策应当以si从小到大为序。这样使用平衡树从中间维护决策序列,就可以在O(nlogn)时间内解决此问题。,事先除去无用状态以获得合适的序,但是,我们仍然求出了一些无用状态!可以证明,如果决策序列的最后一个决策为j,则决策i只有当si小于sj时才可能有用。这时,我们维护的决策序列中的决策恰好满足si_k si_(k+1)。于是刚才的方法实际上只用在序列的末尾进行维护,于是程序的时间复杂度就降到了O(N)。,第三部分总结,从上面的讨论可以看出,凸完全单调性的这个加强中函数g和h的出现带来了很大的灵活性,不仅可以用来加速求解权函数本身就凸的情形,还可以解决权函数并不凸的形式,而且其应用也不仅限于动态规划问题。维护决策序列,更应当被看作一种思考问题的方法。,谢谢大家!,