Description 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 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 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. An input/output sample is in the table below. Here there 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个点的坐标(按x的升序), 你的任务是设计一条路线从最左边出发,到最右边再返回最左边,每点恰好经过一次。问最小代价。能够看成两个人从最左端同一时候出发。 每点恰有一人经过的最小代价。 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<limits.h> #include<cmath> typedef long long LL; using namespace std; const int maxn=110; double x[maxn],y[maxn]; double dp[maxn][maxn]; double dis(int i,int j) { return sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])); } int main() { int n; while(~scanf("%d",&n)&&n) { for(int i=0;i<n;i++) scanf("%lf%lf",&x[i],&y[i]); for(int i=0;i<n;i++) { for(int j=0;j<n;j++) dp[i][j]=INT_MAX; } dp[0][0]=0.0;//初始化 for(int i=0;i<n;i++) { for(int j=0;j<i;j++) { dp[i][i-1]=min(dp[i][i-1],dp[i-1][j]+dis(i,j));//当走到dp[i-1][j]要走到第i个点时。有两种途径 dp[i][j]=min(dp[i][j],dp[i-1][j]+dis(i-1,i));//在i-1的人走到i或在j的人走到i; } } // for(int i=0;i<n;i++) // printf("fuck %d\n",dp[n-1][i]); double ans=dp[n-1][n-2]+dis(n-1,n-2); printf("%.2f\n",ans); } return 0; } |
版权声明:本文博主原创文章,博客,未经同意不得转载。