关于导弹拦截问题

      这里要讲的是导弹拦截的第二问,即:给定一个序列,求它的最小链覆盖。

      经典的做法是对每两个可以搞到一起的点连边,用之前讲的h-k算法求一遍最大匹配,但是,这种方法的复杂度可能会退化到O(n^2)。一种有效的解法是利用dilworth定理求一遍最长反链,其复杂度为O(nlog(n))。

      先介绍一下偏序关系:对集合A中的两个元素,引入一个序的概念,设为R,很明显,要么R(x,y),要么R(y,x),要么x,y之间根本没有序。若对一个集合A和定义在A之上的序R,恒有:(1)R(x,x)(自反性);(2)若R(x,y)且R(y,x)则x=y(反对称性);(3)若R(x,y)且R(y,z),则有R(x,z)(传递性),则称A为偏序集,记为(A,R)。

     对一个偏序集(A,R),若R(x,y)或R(y,x),则称x,y是可比的,否则就是不可比的。

     一个链是偏序集的一个子集,它的任意两个元素都是可比的。

    一个反链是偏序集的一个子集,它的任意两个元素都是不可比的。

     很明显,导弹拦截中给出的序列对于R(i>j且ai<aj)是一个偏序集。题目所求的就是他的最小链覆盖。

     dilworth定理:对一个有限偏序集A,它的最小链覆盖=最长反链。证明自己翻书。

     于是,原问题就得到了一个完美的解决:求出原序列的的最长上升子序列,即为所求的答案。

     

     总之,在有限偏序集中,有:

     (1)最长链=最小反链覆盖

     (2)最长反链=最小链覆盖


    再附一个链接:http://blog.csdn.net/emoizhang/article/details/8009123,他讲了一下证明,不过他把链和反链的概念弄混了,不知道现在改过来没有。对他的证明只要看思路就行了。

     推荐例题:poj3636


BY QW

转载请注明出处

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值