题意:给出按照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 + 双调旅行商问题)的更多相关文章

  1. UVA 1347 Tour 【双调旅行商/DP】

    John Doe, a skilled pilot, enjoys traveling. While on vacation, he rents a small plane and starts vi ...

  2. ACM - 动态规划 - UVA 1347 Tour

    UVA 1347 Tour 题解 题目大意:有 \(n\) 个点,给出点的 \(x\).\(y\) 坐标.找出一条经过所有点一次的回路,从最左边的点出发,严格向右走,到达最右点再严格向左,回到最左点. ...

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

    Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3929   Accepted: 1761 Description ...

  4. UVA 1347 Tour 双调TSP

    TSP是NP难,但是把问题简化,到最右点之前的巡游路线只能严格向右,到最右边的点以后,返回的时候严格向左,这个问题就可以在多项式时间内求出来了. 定义状态d[i][j]表示一个人在i号点,令一个人在j ...

  5. UVA 1347"Tour"(经典DP)

    传送门 参考资料: [1]:紫书 题意: 欧几里得距离???? 题解: AC代码: #include<bits/stdc++.h> using namespace std; ; int n ...

  6. UVa 1347 Tour

    Tour Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Description   Joh ...

  7. UVA.10192 Vacation (DP LCS)

    UVA.10192 Vacation (DP LCS) 题意分析 某人要指定旅游路线,父母分别给出了一系列城市的旅游顺序,求满足父母建议的最大的城市数量是多少. 对于父母的建议分别作为2个子串,对其做 ...

  8. UVA.10130 SuperSale (DP 01背包)

    UVA.10130 SuperSale (DP 01背包) 题意分析 现在有一家人去超市购物.每个人都有所能携带的重量上限.超市中的每个商品有其相应的价值和重量,并且有规定,每人每种商品最多购买一个. ...

  9. UVA 1347(POJ 2677) Tour(双色欧几里德旅行商问题)

    Description John Doe, a skilled pilot, enjoys traveling. While on vacation, he rents a small plane a ...

随机推荐

  1. nefu 1191 平行宇宙 (bfs)

    Description 小k是时空贸易者,他经常在两个平行宇宙之间往来经商,现在他要从S点到达E点,问最少需要多长时间.(已知小k在同一个宇宙中只能向上下左右四个方向移动,每次移动需要1个单位时间,且 ...

  2. 接口post +json +bean

    public ReturnBean<DealBean> getMember(String tagtype, String tag) { try { String requestUrl = ...

  3. 201312月CCF-2,ISBN号码分析

    明天要考CCF啦,偶还是很紧张的.最近看了数据结构,今天才开始上机练习,对,我就是这么懒..废话不多说,我写这篇文章主要是分析CCF编程的小窍门,因为在网上没找到,所以我决定自力更生丰衣足食.!!!! ...

  4. 解决没有X11/Xlib.h 的错误

    1. 解决没有X11/Xlib.h 的错误Install XLib $sudo apt-get install libx11-dev 2. 提示错误:未找到软件源 解决办法很简单,更换另一个源就行了. ...

  5. Asp.Net MVC 在后台获取PartialView、View文件生成的字符串

    在Asp.net MVC的实际开发中,有时需要在后台代码中获取某个View 或者 PartialView 生成的字符串,示例如下: 1. 将View文件输出为字符串: /// <summary& ...

  6. 模拟SPI协议时序

    SPI是串行外设接口总线,摩托罗拉公司开发的一种全双工,同步通信总线,有四线制和三线制. 在单片机系统应用中,单片机常常是被用来当做主机(MASTER),外围器件被当做从机(SLAVE). 所以,在以 ...

  7. cookie和session的区别(搜狐笔试考到的一个题目)

    一.cookie机制和session机制的区别***************************************************************************** ...

  8. 给windows共享 目录付于权限

    1.点右监 共享给 某用户 2.点属性 -> 安全 加入  特定用户 3.域用户的管理 (选择控制面板/用户管理) 第一个用户是本地账户 第2/3个是域用户

  9. 关于Webdriver自动化测试时,页面数据与数据库id不一致的处理方式,需要使用鼠标事件

    有时候Web页面需要通过onmouseout事件去动态的获取数据库的数据,在使用Webdriver进行自动化测试的时候,对于页面显示的数据,其在数据库可能会存在一个id或者code,但是id或者cod ...

  10. js 手动轮播和自动轮播

    $(function(){ //默认值 $("#carousel1").css("background-color","#FFF"); // ...