poj 2677 dp(双调巡游)

双调欧几里得旅行商问题”详解 双调欧几里得旅行商问题”详解 (“双调欧几里得旅行商问题”是《算法导论》(第三版)第15章“动态规划”下第3道思考题)   问题描述:给定平面上n个点,求出连接所有n个点的最短巡游路线,巡游路线限制为双调巡游,即从最左边的点开始,严格向右前进,直至最右边的点,然后调头严格向左前进,直至回到起始点。(假定任何两个点的x坐标均不相同,点1,2,…,n按x坐标增序排列。)设计一个O(n^2) 阅读详情

题意:双调巡游(bitonic tours)旅行商问题(算法导论中文第三版15-3题)

思路:dp。对巡游线路的两个部分分别维护可能的最优解。

dp[i][j]代表走的快的人到达j,走的慢的人到达i时的最小距离。怎么得到dp[i][j]呢,这要分情况。如果i<j-1,那么dp[i][j]只能从dp[i][j-1]+dis[j-1][j]得到。如果i==j-1,那么dp[i][j] = min(dp[i][j],dp[k][j-1]+dis[k][j])(遍历1<=k<=j-2)。最后求所有的dp[i][n]+dis[i][n]的最小值(遍历i)即可。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define N 55
#define INF 0x3fffffff;
double dp[N][N],t[N][N];
struct point{
    int x,y;
}p[N];
int n;
double dis(int i,int j){
    return sqrt((double)(p[i].x-p[j].x)*(p[i].x-p[j].x)+(p[i].y-p[j].y)*(p[i].y-p[j].y));
}
int main(){
    while(scanf("%d",&n) != EOF){
        int i,j;
        double res=INF;
        for(i = 1;i<=n;i++)
            scanf("%d %d",&p[i].x,&p[i].y);
        for(i = 1;i<n;i++)
            for(j = i+1;j<=n;j++)
                t[i][j] = dis(i, j);
        dp[1][2] = dis(1,
POJ2677 TourDP双调巡游 题意: 算法导论上的一道习题,给出一系列点的的坐标,现在从最左端出发,到达最右端的点,再返回原点,要求遍历所有点并且路程最短。 要点: 出发又返回可以看成两个人同时从左往右走,其中一个人走的快一个人走的慢。重点是因为一个点只能走一次,所以可以想出最优子结构,假设现在用dp[i][j]表示两个人分别走到点i和j的最短路径,下一步是走到i+1这个点,那么可能是位置为i的人走到,又或者是位置为j的 阅读详情

相关推荐

Protobuf 枚举设计规范:3 个最佳实践与 2 个版本兼容性案例

本文详细介绍了Protobuf枚举设计的3个最佳实践与2个版本兼容性案例,包括必须声明零值作为默认项、枚举项的命名与值分配规范以及作用域与复用策略。通过实际案例展示了如何安全添加新枚举值和弃用与删除枚举值,确保系统扩展性和兼容性。

HJ921004的博客 429

双调欧几里得旅行商

算法导论15-1思考题:双调欧几里得旅行商问题,时间复杂度O(N^2)

100道动态规划——1 UVA 1347 Tour 算法导论书后习题 双调巡游

这道题目实际上是算法导论动态规划那一章的一个书后习题,那个习题是说TSP是一个NP难问题,但是加上一个限制的话就可以利用动态规划把这个问题在多项式内解出来,也就是这道题目了。                  限制了旅行的方式,让这个人向左一直走到底,然后一直向右走,这就不是随便的走了。                 这是紫书上的一个练习题,在当初没有看紫书的时候,直接对算法导论想了许久没有

Sion 1278

动态规划100例

动态规划100例,绝对找不到比这还全的了!

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

双调欧几里得旅行商问题是一个经典动态规划问题。《算法导论(第二版)》思考题15-1和北京大学OJ2677都出现了这个题目。 旅行商问题描述:平面上n个点,确定一条连接各点的最短闭合旅程。这个解的一般形式为NP的(在多项式时间内可以求出) J.L. Bentley 建议通过只考虑双调旅程(bitonictour)来简化问题,这种旅程即为从最左点开始,严格地从左到右直至最右点,然后严格地从右到

计算机专业同学的充电站。 2万+

【Algorithm】双调欧几里得旅行商问题

在欧几里得旅行商问题中,给定平面上的n个点作为输入,希望求出所有n个点的最短巡游路线。下图中给出了一个7点TSP问题的解。TSP问题属于NP-hard问题,同时也是NPC问题,我们在[P-NP-NPC关系简述]中介绍过。所以人们大多认为TSP没有多项式时间的算法,虽然这一点并没有被证明。倘若是证明了TSP确实没有多项式时间解法,那么P与NP的关系问题也就迎刃而解了。

Esperanto.的博客 2358

动态规划bitonic tour双调旅行商问题

Description 欧几里德旅行商(Euclidean Traveling Salesman)问题也就是货郎担问题一直是困扰全世界数学家、计算机学家的著名问题。现有的算法都没有办法在确定型机器上在多项式时间内求出最优解,但是有办法在多项式时间内求出一个较优解。 为了简化问题,而且保证能在多项式时间内求出最优解,J.L.Bentley提出了一种叫做bitonic tour双调旅程)的哈密尔...

xyc1719的博客 2047

双调欧几里得旅行商问题的最优算法设计与实现

在解决双调欧几里得旅行商问题(Double Bitonic TSP)时,我们的目标是找到一条从最左边的点开始,严格向右前进至最右边的点,然后严格向左返回起始点的最短路径。这个问题的一个关键特点是,路径的第一部分是递增的(向右),第二部分是递减的(向左)。这种特殊的路径要求使得问题可以通过一种相对简单的动态规划方法来解决,其时间复杂度为O()

笔者从事电信媒体开发多年,愿意将多年的开发经验分享给同行 1469

ZOJ2581 POJ2677 Tour双调DP

传说中的双调DP问题。 要走完全部的点,且要来回的话,我们可以简化为有两个小人,都是从最右边出发的。 我们假设小人中有快的小人和慢的小人,如果慢的小人在一步中超过快的小人,则只是交换了角色。 dp[i][j]指的就是快的人走到i,慢的人走到j的最短距离。 假如现在快的小人走到i-1,慢的小人走到j,则此时就只有两种情况 1. 快的小人走到i,则有dp[i][j]=min(dp[i][j]

Neo Fung的专栏 2005

双调欧几里得旅行商问题【sicily 1163 && poj 2677.Tour

题目链接:http://soj.me/1163 问题描述:由于旅行商问题是NP问题,所有J.L.Bentley建议只考虑双调旅程来简化问题。这种旅程即为从最左点开始,严格地从左到右直至最右点,然后严格地从右到左直至出发点。 分析:由于旅行商问题都是要求访问所有的点一遍而不重复,这里又对路径有个双调的约束,所以其实可以把问题看成是两个人同时从第一个点出发,中间分别经过不同的点(路径没有交集,但是

2030

poj 2677 dp双调tsp

//poj 2677 //sep9 #include #include using namespace std; const int maxN=128; struct P { double x,y; }p[maxN]; int n; double dp[maxN][maxN],dis[maxN][maxN]; double solve() { dp[1][2]=dis[1][2]; fo

sepNINE的专栏 591

双调欧几里得旅行商问题解法 (POJ 2677)

对于这个解法,网上题解一大堆。不过觉得还是算导官方给的解答好些,简洁又清楚。。。   大概总结一下(不是翻译)=.=  首先是排序。 然后确定状态 f[i][j] (i &gt;= j, i == j表示的只有n这个点) 表示 从i到1严格从右往左走然后再从1严格从左往右走到j 这样两条路径的最小值,当然[1, max(i, j)]区间上所有的点都是被访问过得。 存在两种状态 : ...

weixin_33919950的博客 184

POJ 2677 旅行商问题 双调dp或者费用流

Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3408   Accepted: 1513 Description John Doe, a skilled pilot, enjoys traveling. While on vacation, he r...

weixin_33713503的博客 201

双调巡游

问题 给定平面上n个点作为输入,求出连接所有n个点的最短巡游路线。 J.L.Bentley建议将问题简化,限制巡游路线为双调巡游,即从最左边的点开始,严格向右前进,直至最右边的点,然后调头严格向右前进,直至回到起始点。 设计一个O(n^2)时间的最优双调巡游路线算法,可以认为任何两点的x坐标均不同,且所有实数运算都花费单位时间(提示:从左至右扫描,对巡游路线的两个部分分别维护可能的最优解...

weixin_33958585的博客 784

UVa 1347 Tour

题目:Tour   题意: 来自luogu—— John Doe想用最小的路程游览完所有目的地。每个目的地都用坐标xi,yi表示。任何两目的地的xi都不相同。两目的地之间的路程是两点之间的直线距离。John是这样走的:他从最左边的点开始,然后只能向右走,走到最右边的点,然后他只能向左走,回到最开始的点。每个点都要走到,并且除了出发点以外每个点只能经过一次。 请写出一个程序求符合要求的最小...

iwi 211

算法导论 — 思考题15-3 双调欧几里得旅行商问题

双调欧几里得旅行商问题)在欧几里得旅行商问题中,给定平面上nnn个点作为输入,希望求出连接所有nnn个点的最短巡游路线。下图(a)给出了一个7点问题的解。此问题是NP难问题,因此大家相信它并不存在多项式时间的求解算法(参见第34章)。   J. L. Bentley建议将问题简化,限制巡游路线必须为双调巡游(bitonic tours),即从最左边的点开始,严格向右前进,直至最右边的点,然后调头...

yangtzhou的专栏 4634

双调旅程(bitonic tour)问题

J.L. Bentley 建议通过只考虑双调旅程(bitonic tour)来简化TSP问题。,这种旅程即为从最左点开始,严格地从左到右直至最右点,然后严格地从右到左直至出发点。       双线性DP。 将一个人从最左端走到最右端,然后从最右端走到最左端等价成两个人同时从最左端不重复的走过中间的点并且到最右端。 我们不妨设这两个人为A和B,且总是假定走在前

老李2009 1735
上一篇: poj 3469 最大流dinic(双核CPU)
下一篇: poj 3074/3076 数独(Dancing Links)
dumeichen
博客等级 码龄12年 55粉丝 475原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值