这两天被Dilworth、链和反链搞到头昏脑胀,终于有点眉目,现在来总结一下。
Dilworth定理说的是:对于一个偏序集,其最少链划分数等于其最长反链的长度。
Dilworth定理的对偶定理说的是:对于一个偏序集,其最少反链划分数等于其最长链的长度。
Dilworth定理先不证,有空再不上来,其对偶定理证明如下:
设一个偏序集S的最少反链划分数是p,最长链长度是r。
1.先证p≥r。这是显然的,因为最长链长度是r,r个元素中的任意两个都可以比较,因此它们必定两两属于不同的反链,因此反链个数≥r,即p≥r。
2.再证r≥p。设X1=S。找出X1的所有极小元组成集合Z1,将其从X1删之,得到X2,再找出X2的所有极小元组成集合Z2(特别注意Z2中的任何元素a2,在X1中必然存在一个元素a1使得a1≤a2,否则a2可以放到X1中,这与X1的选取矛盾),再将Z2从X2中删除,得到X3,……这样一直下去,总存在一个k使得XK不空但X(K+1)为空。这样便得到一条链a1,a2,a3,……,ak,其中ai属于Xi。由于r是最长链长度,因此r≥k。另一方面,我们也得到了一个反链划分,即X1,X2,X3,……,XK。由于p是最少反链划分,因此k≥p。因此有r≥p。证毕。
导弹拦截问题可以重述为:对于一个整数序列s,第一问是最长不升子序列,第二问是求其最少的不升序列的划分数。
首先定义一个偏序关系。对于s中的任意两个数a、b,如果a的出现不晚于b,且a的值不小于b,则称a、b满足偏序关系,记作a≤b。特别注意有两点:一是这个小于等于号,它是一种偏序关系,而不是数值上的小于等于;二是定义中说的是“a的出现不晚于b”,而不是“a的出现先于b”,这是因为偏序关系具有反对称性,即a和a自身也是满足偏序关系的。
举个例子,数列s为:1,2,3,2,4,1,3,4。则红色表示的3和2满足上述定义的偏序关系,即3≤2。这样,一个不升子序列即一条链,最长不升子序列的长度即最长链的长度,根据对偶定理,即等于最少反链划分数。由对偶定理的证明,我们可以每次找一个极小元集合来得到最少的反链划分。而这里的极小元集合是这样的a的集合:在a的前面不存在使得x≤a的x。再强调一次,这里的小于等于号表示的是偏序关系,而不是数值大小。根据上面偏序关系的定义,可以通俗的理解为“在a的前面不存在不小于a的数”,即在a前面不存在大于等于a的数。转换一下,不难发现,即每次贪心找一条上升子序列!贪心过程如下,如下:
1,2,3,2,4,1,3,4
其中红色的1,2,3,4为X1,即第一条反链,蓝色的2,3,4为X2,绿色的1为X3。即s的最长不降序列长度为3,这可以在三条反链中各取一个数获得,譬如3,2,1。当然这个复杂度是O(n^2)的,没必要这样做,有更优秀的O(nlogn)算法,这是题外话。
对于第二个问题,求的是最少不升序列划分,即链划分,根据定理,可以转换成求最长反链长度。实际上,一般情况下Dilworth定理是反过来用的,即求最长反链长度转换成球最少链划分。这可以通过求DAG的最小路径覆盖求得。当然这题也可以这样做。
网上看了很多文章,说第二问可以贪心解,但到底为什么可以贪心解,说的倒是乱七八糟。贪心解实际上是运用是Dilworth定理的对偶定理的基础上的,就像上面的证明过程2一样,但网上很多都说贪心解是因为Dilworth定理,这简直就是胡说八道!(当然不排除我没仔细看Dilworth定理的证明过程的原因,有可能Dilworth定理的证明也是贪心的,但我看过一次记得不是)
这题是可以贪心解的,但不是因为Dilworth定理,更不是直接像上面一样套用其对偶定理(如果这样就更扯淡了)。我们重新看第二问,求的是最少不升序列划分,即链划分,即最长反链长度。反链是什么?就是上升子序列,因此第二问求的是最长上升子序列长度。如果我们把序列反过来,如s反过来后是s':4,3,1,4,2,3,2,1;即原序列的最长上升子序列,变为s'的最长下降子序列,这是显然的。
我们对s‘重新定义一个不严格的偏序关系,对于s'中的任意两数a和b,如果a的出现早于b且a的值大于b,则定义a≤b。这里我忽略了反对称性,但对于此题并不影响Dilworth定理的对偶定理的证明。
于是可以像上面那样贪心了:每次选一个极小元子集,使得里面的每个a都满足:在a前面不存在值大于a的数。再转换一下,即每次贪心找一条不降序列!于是这样一个新“偏序”关系下的反链划分:
4,3,1,4,2,3,2,1
于是其最长链长度为4。即s'的最长下降子序列长度为4,即原题第二问答案为4。
这个方法也可以用于pku1065。即对于反链也可以定义一种偏序关系使之成为另一种“链”。
总结一下,对于特殊情况下的链和反链问题,可以通过Dilworth定理的对偶定理来求。特殊情况是什么情况?就是存在两个不同的偏序定义,使得在一种偏序定义下的反链可以构成另一种偏序定义下链!例如导弹拦截,求最长不升序列可以通过用贪心法求升序列的个数求得,求最长下降序列可以通过用贪心法求不降序列的个数求得,真是神奇啊!!
现在想想hdu那题整除不整除的貌似也可以通过这样来转换?嗯过两天有空想想。。
ps:重温第二问,求的是最少不升序列划分,实际上,我们可以重新定义一种“偏序”关系,使得不升序列在这个定义下是一条反链!那怎样定义?可以这样:反链的“反”就是链。不升序列的定义是a出现于b前且数值上≥b;那什么情况下不符合呢?我们可以枚举两个限制的组合:
(1)a出现于b前且数值上a≥b
(2)a出现于b前且数值上a<b
(3)b出现于a前且数值上b<a
(4)b出现于a前且数值上b≥a
其中(1)即不升序列,实际上,(4)也是不升序列,(1)和(4)是等价的,只是把变量互换了而已!同理(2)和(3)是等价的。要使(1)和(4)是反链,令(2)和(3)是链即可,即把链定义成升序列!于是不升序列在这种定义下变成反链,即第二问变成求最少反链划分。这里要重新解释一下Dilworth定理的对偶定理,其贪心思想是用于求最长链长,即最少反链划分,方法是每次找一条反链。一句话,就是贪心地寻找反链可以得到最少的反链划分。于是每次找一个极小元集(即每次贪心找一个不升子序列)。如下:
1,2,3,2,4,1,3,4
答案还是4!真是牛逼!
但这种方法只适用于可以定义两种偏序关系使得一种偏序关系下的链是另一种偏序关系下的反链的情况!