旅行 Tour uva1347

发布时间 2023-04-05 16:24:14作者: towboat

直角坐标系中,有 nn 个点。要求先从左往右走,再从右往左走,不重复的经过每一个点。

求出最短路径(距离为两点间直线距离)。

 

f [i ][j ] 表示点 1~max(i,j) 已走过,的路径长度

 

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <iomanip>
using namespace std;
 const int N =1004;

 int n; 
 int x[N],y[N]; 
 double f[N][N];

 double d(int i,int j){
	return sqrt((x[i]-x[j])*(x[i]-x[j])+
	(y[i]-y[j])*(y[i]-y[j]));
 }	
 void solve(){
 	int i,j;
 	memset(f,0,sizeof f);
 	for(i=1;i<=n;i++) 
 		scanf("%d %d",&x[i],&y[i]);		 
 	  
 		for(i=1;i<n-1;i++) 
 			f[n-1][i] =d(n-1,n)+d(i,n);
 		
 		for(i=n-2;i>=1;i--){
			for(j=i-1;j>=1;j--){
				f[i][j]=min(f[i+1][j]+d(i,i+1),
				f[i+1][i]+d(j,i+1));
			}
		}
 	  
 	printf("%.2lf\n",f[2][1]+d(2,1));
 }
 signed main(){
 	while(scanf("%d",&n)==1) solve();
 }