七夕鹊桥分析

原题

有n对喜鹊。每一对可以表示为(x,y),x、y是喜鹊的编号,并且任意一对,x总是小于y。(c,d)可以连接在(a,b)之后,当且仅当b< c 。多对喜鹊连接在一起,就构建成了鹊桥。给定n对喜鹊,请你构建最长的鹊桥,来帮助有情人相会。

分析

首先,要理解这个题目的意思。具体例子说明,给定下面的例子:

(15,40)  (5,8)  (1,10)  (30,31)  (34,35)  (9,20)  (36,37)  (2,4)

其中,(2,4)和(5,8)能够连接起来,(5,8)和(9,20)能够连接起来,则它们可以都连接起来,为(2,4)(5,8)(9,20)。这一段鹊桥,长度为3。依次类推,还有其他的情况。

然后,理解了题意,该如何解决呢?假设(a,b)(c,d)(e,f)是可以连接起来的三对喜鹊。则它们的关系如下: b < c,d< e,有根据a< b,c< d,e< f。得到,a< b< c< d< e< f,即b< d< f(a< c< e出发考虑,也是一样的。)我们可以想象,以每一对喜鹊的第二只编号为基准,进行排序,最终的结果,可以通过如下列表产生。

(2,4)  (5,8)  (1,10)  (9,20)  (30,31)  (34,35)  (36,37)  (15,40)

怎么找到最长的鹊桥呢?其实就是在上表中,找到最长递增子序列,只不过,在比较连个喜鹊对(a,b)(c,d)的时候,是b和c进行比较即可。这个时间复杂度是O(n^2)的。

可否在从方法的角度,进一步考虑呢?

大家思考一个问题,最长的鹊桥,是否会包括第一对喜鹊。我们假设,不包括第一对喜鹊。最长的鹊桥为s1,s2…sk。每一个si,可以表示为(xi,yi)。s0,(x0,y0)为第一对喜鹊。我们有y1 < x2, 并且 y0 < y1。y0last y 则保留,否则抛弃,最终留下来的,就是最长的鹊桥。如上面的例子,得到

(2,4)  (5,8)  (9,20)  (30,31)  (34,35)  (36,37)

长度为6。

后面这个思路,不够严谨,没有阐述严格的证明,但是存在的。留给大家思考吧。

为了美好的爱情,大家都尽力了么?

【分析完毕】

posted on 2014-01-27 15:45  虚若怀谷  阅读(299)  评论(0编辑  收藏  举报

导航