????????????????
#include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<iostream> #include<queue> #include<vector> #include<sstream> #include<cmath> #include<queue> #include<cctype> #include<set> #include<unordered_set> using namespace std;
const int maxn = 1000+10; int N; double d[maxn][maxn]; struct point{ double x,y; }p[maxn];
double getdist(int i,int j){ point a = p[i], b = p[j]; return sqrt( double( (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y) ) ); }
int main(){ while(scanf("%d",&N) == 1){ for(int i = 1; i <= N; i++) scanf("%lf%lf",&p[i].x,&p[i].y); memset(d,0.0,sizeof(d)); for(int i = N-1; i >= 2; i--) for(int j = 1; j < i; j++) { if(i == N-1) d[i][j] = getdist(i,N) + getdist(j,N); else d[i][j] = min(d[i+1][j]+getdist(i,i+1), d[i+1][i]+getdist(j,i+1)); } printf("%.2f",d[2][1] + getdist(1,2)); } return 0; }