【算法学习】双调欧几里得旅行商问题(动态规划)(转)

双调欧几里得旅行商问题是一个经典动态规划问题。《算法导论(第二版)》思考题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)}.。

时间: 2024-10-27 05:01:36

【算法学习】双调欧几里得旅行商问题(动态规划)(转)的相关文章

双调欧几里得旅行商问题

杭电ACM的一道题~~ Problem Description 有很多从磁盘读取数据的需求,包括顺序读取.随机读取.为了提高效率,需要人为安排磁盘读取.然而,在现实中,这种做法很复杂.我们考虑一个相对简单的场景.磁盘有许多轨道,每个轨道有许多扇区,用于存储数据.当我们想在特定扇区来读取数据时,磁头需要跳转到特定的轨道.具体扇区进行读取操作.为了简单,我们假设磁头可以在某个轨道顺时针或逆时针匀速旋转,旋转一周的时间是360个单位时间.磁头也可以随意移动到某个轨道进行读取,每跳转到一个相邻轨道的时间

2014年百度之星程序设计大赛 - 资格赛 1002 Disk Schedule(双调欧几里得旅行商问题)

Problem Description 有很多从磁盘读取数据的需求,包括顺序读取.随机读取.为了提高效率,需要人为安排磁盘读取.然而,在现实中,这种做法很复杂.我们考虑一个相对简单的场景.磁盘有许多轨道,每个轨道有许多扇区,用于存储数据.当我们想在特定扇区来读取数据时,磁头需要跳转到特定的轨道.具体扇区进行读取操作.为了简单,我们假设磁头可以在某个轨道顺时针或逆时针匀速旋转,旋转一周的时间是360个单位时间.磁头也可以随意移动到某个轨道进行读取,每跳转到一个相邻轨道的时间为400个单位时间,跳转

UVA 1347(POJ 2677)Tour(双调欧几里得旅行商问题)

Tour                 Time Limit:3000MS    Memory Limit:0KB    64bit IO Format:%lld & %llu Description John Doe, a skilled pilot, enjoys traveling. While on vacation, he rents a small plane and starts visiting beautiful places. To save money, John mus

[ACM] POJ 2677 Tour (动态规划,双调欧几里得旅行商问题)

Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3585   Accepted: 1597 Description John Doe, a skilled pilot, enjoys traveling. While on vacation, he rents a small plane and starts visiting beautiful places. To save money, John must

UVA - 1347 Tour 双调欧几里得旅行商问题

题目大意:给出n个点,要求你从最左边那个点走到最右边那个点,每个点都要被遍历过,且每个点只能走一次,问形成的最短距离是多少 解题思路:用dp[i][j]表示第一个人走到了第i个点,第二个人走到了第j个点且已经遍历了1–max(i,j)的所有点的最短距离.因为dp[i][j] = dp[j][i]的,所以我们设i > j的 那么就有 当j < i-1 时,dp[i][j] = dp[i-1][j] + dis(i, i -1) 当j == i + 1时情况就比较特别了,这里将j用i-1代替 dp

hdu 4824 Disk Schedule(双调欧几里得旅行商问题)

题目链接:hdu 4824 Disk Schedule 题目大意:中文题. 解题思路:需要的时,很明显每到一层是要读取一次数据的,但是因为需要返回00,所以有些层的数据可以在返回的过程中读取会较优.于是转化成了双调欧几里得旅行商问题. #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> using namespace std; const int N = 1

《算法导论》思考题15-1 双调欧几里得旅行商问题(动态规划)

欧几里得旅行商问题 是对平面上给定的n个点确定一条连接各点的最短闭合旅程的问题.图a给出了7个点问题的解,这个问题的一般形式是NP完全的,故其解需要多于多项式的时间. J.K.Bentley建议通过只考虑双调旅程来简化问题,这种旅程即为从最左点开始,严格从左到最右点,再严格地从最右点回到最左点.图b显示了同样的7个点的问题的最短双调路线,在这种情况下,多项式的时间的算法是有可能的. 描述一个确定最优双调路线的O(n^2)时间的算法.可以假设任何两点的x坐标都不相同. 解法: 读了很多遍这个题,也

POJ2677 Tour(DP+双调欧几里得旅行商问题)

Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3929   Accepted: 1761 Description John Doe, a skilled pilot, enjoys traveling. While on vacation, he rents a small plane and starts visiting beautiful places. To save money, John must

【双调欧几里得】HDU 4824

通道:http://acm.hdu.edu.cn/showproblem.php?pid=4824 题意:中文题意 思路:裸双调欧几里得,关键在于转换思路就好了,把磁盘的每一层看作是已经X排序过的. 代码: TAG:双调欧几里得 以下是双调欧几里得学习资料. 欧几里得旅行商问题是对平面上给定的n个点确定一条连接各点的最短闭合旅程的问题.如图(a)给出了一个7个点问题的解.这个问题的一般形式是NP完全的,故其解需要多于多项式的时间. J.L. Bentley 建议通过只考虑双调旅程(bitonic