前言
二次在水里划船祭。晚上因为lower_bound( )和upper_bound( ) 出现的问题跟老师讨论,21:20从创客实验室出来,外面暴雨又打闪,感谢老师的雨伞,虽然踩到水坑的那一刻想紫衫。
正题
狄尔沃斯定理(Dilworth's theorem)亦称偏序集分解定理
什么意思?举个简单的例子就好懂了。
此例子基于一道经典题目:P1020 [NOIP1999 提高组] 导弹拦截
对于一个序列 389,207,155,300,299,170,158,65
肉眼可见
最长不上升子序列为:389,300,299,170,158,65
剩下 207,155又可以构成一个不上升子序列。
假设:那如果剩下207,1,155就可以再划分出两个不上升子序列了(207,1和155)。
也就是说,每次我们要从一个长序列中划分出一个序列(确保这个序列是剩下元素的最长不上升子序列),且一旦被划分出去,下一次不能被划分使用。
这个例子,最后能够分成389,300,299,170,158,65和207,155两个不上升子序列。
又肉眼可见,
这个例子的最长上升子序列的长度最大为2(155,170或155,158)。
因此,对于这个例子,最长上升子序列的长度与分出的不上升子序列的数目相等。
再根据这个去对着定义想,好像就有点意思了。
那为什么这个例子是成立的呢?能否简单证明?
以下为思路,并不严密。
设一个序列A为 a 1 , a 2 , a 3 . . . a n a_1,a_2,a_3...a_n a1,a2,a3...an,该序列的一个不上升子序列B为 b 1 , b 2 , b 3 . . . b n b_1,b_2,b_3...b_n b1,b2,b3...bn, l l l为B的长度且 l ⩾ 1 l\geqslant1 l⩾1, y y y为 b 1 b_1 b1在序列A中的前一个数, x x x为 b n b_n bn在序列A中的后一个数。(注意:B中的元素在A中并不一定连续)
则①满足 b 1 ⩾ b 2 ⩾ b 3 ⩾ . . . ⩾ b n b_1\geqslant b_2\geqslant b_3 \geqslant ...\geqslant b_n b1⩾b2⩾b3⩾...⩾bn
第一种情况,当不上升子序列的长度 l = n l=n l=n 时:说明整个序列都是单调不上升的,序列B=序列A;
② b 1 = a 1 , b n = a n b_1=a_1,b_n= a_n b1=a1,bn=an即 b 1 b_1 b1就等价于序列A的第一个数, b n b_n bn就等价于序列A的最后一个数,也即, b 1 b_1 b1在序列A中的前一个数 y y y 不存在, b n b_n bn在序列A的后一个数 x x x不存在。
第二种情况,当不上升子序列的长度 l ≠ n l≠n l=n时:
说明, b 1 b_1 b1在序列A中的前一个数小于它,否则不可能产生新的不上升子序列。
对于序列2,6,3,5,4的最长不上升子序列为6,5,4,此时 b 1 = a 2 = 6 b_1=a_2=6 b1=a2=6,存在 y = a 1 = 2 < b 1 = a 2 = 6 y=a_1=2 <b_1=a_2=6 y=a1=2<b1=a2=6。试想,如果令 y = a 1 = 6 y= a_1=6 y=a1=6,则序列6,6,3,5,4的最长不上升子序列应为6,6,5,4,此时 y y y也应计入最长不上升子序列的贡献中,但因为规定了 y y y为 b 1 b_1 b1在序列A中的前一个数,所以 y y y不能作为序列B的贡献,所以此假设不存在。由此可得,③必然满足 y < b 1 y< b_1 y<b1。
还说明此时序列中必然存在一个数 x x x使得这个最长不上升子序列终结,比方说,6,5,4,3,2,6,5,4。原本前五个数6,5,4,3,2可构成一个不上升子序列,突然出现了一个比2大的6使得该序列突然终止。此时这个6就是上述的 x x x,2就是上述的 b n b_n bn,④则必定满足 x > b n x>b_n x>bn。
- 由②③④可得: b 1 b_1 b1在序列A中的前一个数 y y y小于它或不存在, b n b_n bn在序列A中的后一个数大于它或不存在。也可写成⑤ y < b 1 , b n < x y<b_1,b_n<x y<b1,bn<x。
- 由①⑤可得: y < b 1 ⩽ b 2 ⩽ b 3 ⩽ . . . ⩽ b n < x y< b_1\leqslant b_2\leqslant b_3 \leqslant ...\leqslant b_n <x y<b1⩽b2⩽b3⩽...⩽bn<x
∴ y < x \therefore y<x ∴y<x
又 ∵ \because ∵ y y y为 b 1 b_1 b1在序列A中的前一个数,x为 b n b_n bn在序列A中的后一个数
∴ \therefore ∴ 令 y = a i y=a_i y=ai,则 x = a i + n + 1 x=a_{i+n+1} x=ai+n+1
∴ a i < a i + n + 1 且 i < i + n + 1 \therefore a_i< a_{i+n+1} 且 i< i+n+1 ∴ai<ai+n+1且i<i+n+1
所以 a i a_i ai和 a i + n + 1 a_{i+n+1} ai+n+1又可以构成一个上升子序列C,
此时,可以理解成 a i a_i ai是由前一个不上升子序列产生的, a i + n + 1 a_{i+n+1} ai+n+1是由另一个不上升子序列产生的
即每产生一个不上升子序列,就会增加一个 a a a,也即C的长度就会增加。
综上可得,上升子序列C的长度与不上升子序列的数量相等。
(以上均为个人理解,如有漏洞请指出,谢谢观看)