UVA - 1347 Tour(DP + 双调旅行商问题)
题意:给出按照x坐标排序的n个点,让我们求出从最左端点到最右短点然后再回来,并且经过所有点且只经过一次的最短路径。
分析:这个题目刘汝佳的算法书上也有详解(就在基础dp那一段),具体思路如下:按照题目的描述比较难考虑,不如把这个问题想成两个人,分别从最左端走到最右端并且不走到重复的点所需要的最小路程,我们定义dp【i,j】表示第一个人走到第i个位置,第二个人走到第j个位置所耗费的路程,并且让第一个人的位置大于第二个人的位置,且前i个城市都已经被走过,那这样的话能走的点只有i+1,i+2,……n这些点,但是如果这些点都可以走的话,我们是无法进行状态转移的,比如走到i+2的时候,i+1这个点没有被走过,不符合状态的定义,所以我们每次只向前走到i+1这个点,如果是第一个人走到这个点,dp【i+1】【j】 = dp【i】【j】+dis(i,i+1);
如果是第二个人走到这个点,dp【i+1】【i】 = dp【i】【j】 + dis【j】【i+1】;因为(dp【i+1】【i】 = dp【i】【i+1】,按照定义必须写成以上形式)。
注意:我们强制只能走到i+1这个点,会不会漏解呢? 不会的,因为如果我们走到了i+2这个点,又要保证i+1这个点被人走过,只能让第二个人去走,而在我们的状态转移中,已经包含了这种情况,所以不会漏解。
最后:dp[n][i],i>=1 && i<n的最小值就是答案,还有就是这个题我用G++的都挂了,C++就AC了……编译器好神奇。。。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
#define N 200
#define INF 999999999.9
double x[N],y[N],dis[N][N];
double dp[N][N];
double Get_Dis(int i,int j)
{
return sqrt((x[i]-x[j])*(x[i]-x[j]) + (y[i]-y[j])*(y[i]-y[j]));
}
double mymin(double x,double y)
{
if(x < y) return x;
return y;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i = ; i <= n; i++)
{
scanf("%lf %lf",&x[i],&y[i]);
}
for(int i = ; i <= n; i++)
{
for(int j = ; j <= n; j++)
{
if(i==j) dis[i][j] == ;
else dis[i][j] = Get_Dis(i,j);
}
}
for(int i = ; i <= n; i++)
{
for(int j = ; j <= n; j++)
{
dp[i][j] = INF;
}
}
dp[][] = dis[][];
for(int i = ; i < n; i++)
{
for(int j = ; j < i; j++)
{
dp[i+][j] = mymin(dp[i+][j],dp[i][j]+dis[i][i+]);
dp[i+][i] = mymin(dp[i+][i],dp[i][j]+dis[j][i+]);
}
}
double ans = INF+;
for(int j = ; j <= n-; j++)
{
ans = mymin(ans,dp[n][j]+dis[j][n]);
}
printf("%.2lf\n",ans);
}
return ;
}
UVA - 1347 Tour(DP + 双调旅行商问题)的更多相关文章
- UVA 1347 Tour 【双调旅行商/DP】
John Doe, a skilled pilot, enjoys traveling. While on vacation, he rents a small plane and starts vi ...
- ACM - 动态规划 - UVA 1347 Tour
UVA 1347 Tour 题解 题目大意:有 \(n\) 个点,给出点的 \(x\).\(y\) 坐标.找出一条经过所有点一次的回路,从最左边的点出发,严格向右走,到达最右点再严格向左,回到最左点. ...
- POJ2677 Tour(DP+双调欧几里得旅行商问题)
Tour Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3929 Accepted: 1761 Description ...
- UVA 1347 Tour 双调TSP
TSP是NP难,但是把问题简化,到最右点之前的巡游路线只能严格向右,到最右边的点以后,返回的时候严格向左,这个问题就可以在多项式时间内求出来了. 定义状态d[i][j]表示一个人在i号点,令一个人在j ...
- UVA 1347"Tour"(经典DP)
传送门 参考资料: [1]:紫书 题意: 欧几里得距离???? 题解: AC代码: #include<bits/stdc++.h> using namespace std; ; int n ...
- UVa 1347 Tour
Tour Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu Description Joh ...
- UVA.10192 Vacation (DP LCS)
UVA.10192 Vacation (DP LCS) 题意分析 某人要指定旅游路线,父母分别给出了一系列城市的旅游顺序,求满足父母建议的最大的城市数量是多少. 对于父母的建议分别作为2个子串,对其做 ...
- UVA.10130 SuperSale (DP 01背包)
UVA.10130 SuperSale (DP 01背包) 题意分析 现在有一家人去超市购物.每个人都有所能携带的重量上限.超市中的每个商品有其相应的价值和重量,并且有规定,每人每种商品最多购买一个. ...
- UVA 1347(POJ 2677) Tour(双色欧几里德旅行商问题)
Description John Doe, a skilled pilot, enjoys traveling. While on vacation, he rents a small plane a ...
随机推荐
- Gentoo安装详解(五)-- 安装X桌面环境
安装X桌面环境: 安装Xorg: 检测显卡信息: dmesg | grep video lspci | grep -i VGA 配置INPUT_DEVICE.VIDEO_CARDS变量: 在安装Xor ...
- C -小晴天老师系列——竖式乘法
C - 小晴天老师系列——竖式乘法 Time Limit: 4000/2000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others ...
- hdu5573 二叉树找规律,二进制相关
input T 1<=T<=100 n k 1<=n<=1e9 n<=2^k<=2^60 output 从1走到第k层,下一层的数是上一层的数×2或者×2+1,每 ...
- c语言结构体指针必须初始化
先说结论 结构体指针需要初始化 结构体指针的成员指针同样需要初始化 结构体变量定义的时候就已经分配了内存空间,而上面两个确没有 struct test{ int i; struct buf *p;} ...
- Compile Time Assertion..
The most seen assertion are during runtime, but this one is at compile time, to give the error more ...
- 点赞增加的jquery写法
$('.dianzan').click(function(){ $(this).find('span').html(parseInt($(this).find('span').html())+1) } ...
- 字符串匹配之boyer-Moore算法
Boyer-Moore算法不仅效率高,而且构思巧妙,容易理解.1977年,德克萨斯大学的Robert S. Boyer教授和J Strother Moore教授发明了这种算法. 下面,我根据Moore ...
- XBOX360 硬盘玩游戏
首先PC端需要到flashFXP这个软件,因为级别不够上传不了就发个下载网站各位自己下一下吧.http://www.oyksoft.com/soft/14875.html#oyksoftdown 好了 ...
- linux时间同步,ntpd、ntpdate
linux时间同步,ntpd.ntpdate 在Windwos中,系统时间的设置很简单,界面操作,通俗易懂.而且设置后,重启,关机都没关系.系统时间会自动保存在Bios的时钟里面,启动计算机的时候,系 ...
- listview条目用状态选择器没反应
button和imagebutton天生具有“可点击(click)”.“可按下(press)”的特性,radiobutton具有“可勾选(check)”的特性,但是listview的条目只有“可按下( ...