zoukankan      html  css  js  c++  java
  • 2014年百度之星程序设计大赛

    双调欧几里得旅行商问题是一个经典动态规划问题。《算法导论(第二版)》思考题15-1和北京大学OJ2677都出现了这个题目。

    旅行商问题描写叙述:平面上n个点,确定一条连接各点的最短闭合旅程。

    这个解的一般形式为NP的(在多项式时间内能够求出)

    J.L. Bentley 建议通过仅仅考虑双调旅程(bitonictour)来简化问题,这样的旅程即为从最左点開始。严格地从左到右直至最右点,然后严格地从右到左直至出发点。

    下图(b)显示了相同的7个点的最短双调路线。在这样的情况下。多项式的算法是可能的。其实,存在确定的最优双调路线的O(n*n)时间的算法。

    上图中,a是最短闭合路线。这个路线不是双调的。

    b是最短双调闭合路线。


    求解过程:

    (1)首先将各点依照x坐标从小到大排列,时间复杂度为O(nlgn)。

    (2)寻找子结构:定义从Pi到Pj的路径为:从Pi開始,从右到左一直到P1,然后从左到右一直到Pj。在这个路径上,会经过P1到Pmax(i,j)之间的全部点且仅仅经过一次。

    在定义d(i,j)为满足这一条件的最短路径。

    我们仅仅考虑i>=j的情况。

    同一时候,定义dist(i,j)为点Pi到Pj之间的直线距离。

    (3)最优解:我们须要求的是d(n,n)。

    关于子问题d(i,j)的求解。分三种情况:

    A、当j < i - 1时,d(i,j) = d(i-1,j) + dist(i - 1,i)。

    由定义可知,点Pi-1一定在路径Pi-Pj上,并且又因为j<i-1,因此Pi的左边的相邻点一定是Pi-1.因此能够得出上述等式。

    B、当j = i - 1时,与Pi左相邻的那个点可能是P1到Pi-1总的不论什么一个。因此须要递归求出最小的那个路径:

    d(i,j) = d(i,i-1) = min{d(k,j) + dist(i,k)},当中1 <= k <= j。

    C、当j=i时,路径上最后相连的两个点可能是P1-Pi、P2-Pi...Pi-1-Pi。

    因此有:

    d(i,i) = min{d(i,1)+dist(1,i),...,d(i,i-1),dist(i-1,i)}.。


    參考


    小记:这题之前分析是哈密顿回路。旅行商问题即是。

    可是没去百度了,如今百度出来了。參考


  • 相关阅读:
    check whether trace enabled
    11g新特性之IO校准(IO Calibration)
    缩小Oracle的系统表空间(SYSTEM、TEMP、UNDOTBS1、SYSAUX)
    性能优化】optimizer statistics统计信息管理技巧
    cluster c_obj#intcol# is growing too fast
    查询高水位
    SYSAUX and purging big objects (segments) manually
    第44课 继承中的访问级别
    第43课 继承的概念和意义
    第39课 逗号操作符的分析
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5101356.html
Copyright © 2011-2022 走看看