【叨叨叨】Dilworth定理的简单理解

在这里插入图片描述

前言

二次在水里划船祭。晚上因为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 l1 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 b1b2b3...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=a1bn=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<b1b2b3...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+1i<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的长度不上升子序列的数量相等。

(以上均为个人理解,如有漏洞请指出,谢谢观看)

  • 30
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FFTcwlath

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值