zoukankan      html  css  js  c++  java
  • 七夕鹊桥分析

    原题

    有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。

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

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

    【分析完毕】

  • 相关阅读:
    springMVC:HandlerInterceptor拦截器的使用
    SpringMVC:JSON形式输出(基于Fastjson)
    Callable接口解析
    FastJson一些常见方法(API):处理JSON变得好简单
    Spring@Autowired注解
    一些错误和解决办法--01
    线程池的原理及实现
    Rotate Image(二位数组顺时针旋转)
    JAVA内部类
    jdk9模块化--特性
  • 原文地址:https://www.cnblogs.com/downtjs/p/3534949.html
Copyright © 2011-2022 走看看