1347 - Tour(DP)

原创 2015年07月11日 08:33:25

题意:给定平面上n个点的坐标,设计一条路线,从最左边的点出发,走到最右边的点再返回,要求除了最左点和最右点之外每个点恰好经过一次,问最短路径。

典型的多决策问题,需要用DP解决,关键是每个点恰走一次,所以需要将使DP有序化,因此我们规定d[i][j]表示1~max(i,j)全走过,且当前两人位置是i和j,还需要走多长的距离。

因为这两个人是无所谓的,所以d[i][j] = d[j][i] 。因此不妨规定i > j,且规定d[i][j] 只能转移到d[i+1][j]和d[i][i+1],也就是说下一步只能到i+1。由于i > j,所以转移到d[i+1][j] 和d[i+1][i]

为什么这样是对的呢? 之前已经说了,d[i][j] = d[j][i]   所以转移到那两个状态的意思就是第一个人转移到下一步或者第二个人转移到下一步,因此这个记录过程其实和背包是一样的(选当前这个物品或者不选)   ,  也就是说之前的最优结果都被记录了,所以这样的递推做法是完美的。

细节参见代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1000 + 10;
int n;
double x[maxn],y[maxn],dist[maxn][maxn],d[maxn][maxn];
int main(){
    while(~scanf("%d",&n)) {
        for(int i=1;i<=n;i++) scanf("%lf%lf",&x[i],&y[i]);
        //计算距离
        for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++) {
            dist[i][j] = sqrt((x[i]-x[j])*(x[i]-x[j]) + (y[i]-y[j])*(y[i]-y[j]));
        }
        //dp
        for(int i=n-1;i>=1;i--)
        for(int j=1;j<i;j++) {
            if(i==n-1) d[i][j] = dist[n-1][n] + dist[j][n];
            else d[i][j] = min(d[i+1][j] + dist[i][i+1],d[i+1][i] + dist[j][i+1]);
        }
        d[1][1] = d[2][1] + dist[1][2];//因为i > j ,所以循环中只记录到d[2][1]
        printf("%.2f\n",d[1][1]);
    }
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

uva 1347 Tour 旅行

给出n个点的坐标,现在要从最左边的点出发,到达最右边的点,再从最右边的点回到最左边的点,要求除了最左边和最右边的点外,其他所有点都被访问一次。求最短距离。 题目:点我 很简单,从左...
  • yskyskyer123
  • yskyskyer123
  • 2016年01月31日 23:46
  • 599

uva 1347 - Tour(双调欧几里得旅行商问题)

题目链接:uva 1347 - Tour 题目大意:给出n个点,确定一条连接各点的最短闭合旅程的问题。 解题思路:dp[i][j]表示说从i联通到1,再从1联通到j的距离。 ...
  • u011328934
  • u011328934
  • 2014年03月26日 09:37
  • 2593

UVA1347 Tour (DP)

题目大意:有n个点,给出x、y坐标。找出一条路,从最左边的点出发,严格向右走到达最右点再严格向左回到最左点。问最短路径是多少?分析: 1.首先需要将原问题转化为,两个人A、B同时从最左边的点出发...
  • qq_28236309
  • qq_28236309
  • 2016年07月17日 12:46
  • 473

UVa - 1347 - Tour

动态规划,主要还是状态的定义,首先题目要求是走过去再走回来,等价命题:两个人同时从最左边的点除法,沿着两条不同的路走到最右边的点。这样就好处理了。 因为输出的格式问题WA了两次,心痛。。。刚开始用了 ...
  • zyq522376829
  • zyq522376829
  • 2015年07月01日 23:19
  • 818

uva 1347 - Tour

#include #include #include #include #include using namespace std; const int maxn = 1010; double d[m...
  • u013382399
  • u013382399
  • 2014年08月07日 16:24
  • 907

UVA 1347 Tour DP

DP dp[i][j] 前i个点已经全部走过,落后的那个人在j号点 往i+1号点转移 既 dp[i+1][i]   or   dp[i+1][j] Tour ...
  • u012797220
  • u012797220
  • 2015年02月07日 23:48
  • 879

Tour - UVa 1347 dp

John Doe, a skilled pilot, enjoys traveling. While on vacation, he rents a small plane and starts vi...
  • u014733623
  • u014733623
  • 2014年08月15日 00:01
  • 522

UVA - 1347 Tour DP

题意: 给按x大小给定一些x值不同的点,问从最左边走到最右边再走回来,每个点走一遍,形成一个环,最短路径是多少 思路: 我们可以确定的是左右断点是确定的,我本来想的是,对于点来说,分到上...
  • xiang_6
  • xiang_6
  • 2017年12月04日 17:40
  • 68

UVa 1347 Tour(DP)

题意  二维坐标系上有n个点  从第一个点出发经过部分点到达第n个点  再从第n个点回到第一个点  除了第一个点  每个点都经过且仅经过一次  求最短路径长度 还是基础的DP  想出状态转移方程就容易...
  • acvay
  • acvay
  • 2015年02月06日 20:12
  • 546

Tour UVA - 1347 (DP)

https://vjudge.net/problem/38898/origin 题目大意和题解过程详见紫书p269 ps:我只说一下自己的理解:  首先这个题有一个关键词是“输入的数据是根据x坐...
  • txgANG
  • txgANG
  • 2017年03月13日 22:16
  • 113
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:1347 - Tour(DP)
举报原因:
原因补充:

(最多只允许输入30个字)