Tour - UVA - 1347-动态规划
发布日期:2022-02-10 08:11:10 浏览次数:19 分类:技术文章

本文共 2600 字,大约阅读时间需要 8 分钟。

***Tour ***

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 determine the shortest closed tour that connects his
destinations. Each destination is represented by a point in the plane pi =< xi
, yi >. John uses the
following strategy: he starts from the leftmost point, then he goes strictly left to right to the rightmost
point, and then he goes strictly right back to the starting point. It is known that the points have
distinct x-coordinates.
Write a program that, given a set of n points in the plane, computes the shortest closed tour that
connects the points according to John’s strategy.
Input
The program input is from a text file. Each data set in the file stands for a particular set of points. For
each set of points the data set contains the number of points, and the point coordinates in ascending
order of the x coordinate. White spaces can occur freely in input. The input data are correct.
Output
For each set of data, your program should print the result to the standard output from the beginning
of a line. The tour length, a floating-point number with two fractional digits, represents the result.
Note: An input/output sample is in the table below. Here there are two data sets. The first one
contains 3 points specified by their x and y coordinates. The second point, for example, has the x
coordinate 2, and the y coordinate 3. The result for each data set is the tour length, (6.47 for the first
data set in the given example).
Sample Input
3
1 1
2 3
3 1
4
1 1
2 3
3 1
4 2
Sample Output
6.47
7.89

题意:按照横坐标从左到右给出n个点,设计一条路线,从最左点出发到最右点后再返回,除最左点和最右点外,每个点只经过一次,求最短路径长度

解题思路:参考《算法竞赛入门经典》P269

#include
#include
#include
#include
#include
#include
#include
#include
#include
#define maxn 50005using namespace std;typedef long long ll;int n;struct F{ int x,y;};F point[1005];double dist[1005][1005];double d[1005][1005];double dp(int i,int j){ if(d[i][j]) return d[i][j]; if(i==n-1) return dist[n-1][n]+dist[j][n]; else return d[i][j]=min(dp(i+1,j)+dist[i][i+1],dp(i+1,i)+dist[j][i+1]);//记得保存在数组中,否则会超时}int main(){ while(scanf("%d",&n)==1) { memset(d,0,sizeof(d)); for(int i=1;i<=n;i++) scanf("%d%d",&point[i].x,&point[i].y); for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) dist[i][j]=dist[j][i]=sqrt((point[i].x-point[j].x)*(point[i].x-point[j].x)+(point[i].y-point[j].y)*(point[i].y-point[j].y)); printf("%.2f\n",dp(2,1)+dist[1][2]); } return 0;}

不过我有一个疑问,按照书中的思路,点1到2的边一定经过,为什么该题的最短路径一定包含点1到2的边?

转载地址:https://blog.csdn.net/qq_44632981/article/details/98645793 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:A - Divisibility Shortcut -Kattis - shortcut
下一篇:Milking Time-POJ - 3616-动态规划

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年03月31日 14时45分30秒