问题
给定平面上n个点作为输入,求出连接所有n个点的最短巡游路线。
J.L.Bentley建议将问题简化,限制巡游路线为双调巡游,即从最左边的点开始,严格向右前进,直至最右边的点,然后调头严格向右前进,直至回到起始点。
设计一个O(n^2)时间的最优双调巡游路线算法,可以认为任何两点的x坐标均不同,且所有实数运算都花费单位时间(提示:从左至右扫描,对巡游路线的两个部分分别维护可能的最优解)。
- 将n个点按x坐标从小到大排序,时间复杂度为O(nlogn);
- 用PATH(i,j)表示从点i严格向左到点1,再严格向右到点j的最短路径,路径包括从点1到点max(i,j)的所有点,因为PATH(i,j)==PATH(j,i),所以只考虑i>=j时的情况;dir(i,j)表示从点i到点j的直接路径;
- 当i>j+1时,点i-1一定是小于i的最大节点,i-1>j,所以PATH(i,j)=PATH(i-1,j)+dir(i,i-1); i>j+1;
- 当i==j+1时,此时点i可能与小于i的所有节点相连,所以PATH(i,j)=min(PATH(k,j)+dir(i,k); k∈{x|x < i};<