#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const ll MOD = 1e9+7;
const double INF = 1e18;
const int N = 505;


struct Point{
    ll x,y;
    Point(ll _x=0,ll _y=0){
        x=_x;
        y=_y;
    }
}p[N];

int ori(Point p1,Point p2,Point p3){
    ll val=(p2.y-p1.y)*(p3.x-p2.x)-(p2.x-p1.x)*(p3.y-p2.y);

    if(val>0)return 1;
    return 2;
}

bool intersect(Point p1,Point q1,Point p2,Point q2){
    int o1=ori(p1,q1,p2);
    int o2=ori(p1,q1,q2);
    int o3=ori(p2,q2,p1);
    int o4=ori(p2,q2,q1);

    if(o1!=o2&&o3!=o4)return true;
    return false;
}

double dist(Point p1,Point p2){
    ll dx=abs(p1.x-p2.x);
    ll dy=abs(p1.y-p2.y);

    return sqrt((double)dx*dx+(double)dy*dy);
}

int quad(Point p1){
    if(p1.x<=0&&p1.y>=0)return 1;
    if(p1.x>0&&p1.y>0)return 2;
    if(p1.x>0&&p1.y<=0)return 3;
    return 4;
}

bool cmp(const Point &p1,const Point &p2){
    if(quad(p1)!=quad(p2))return quad(p1)<quad(p2);
    int o=ori(Point(),p1,p2);
    if(o==1)return true;
    return false;
}

int n;
double dp[N][N];
bool ok[N][N];

double solve(int from,int to){
    if(from>to)return 0.0;
    if(dp[from][to]!=INF)return dp[from][to];

    int c=0;
    for(int i=from+1;i<to;i++){
        if(!c&&ok[from][i])dp[from][to]=min(dp[from][to],dist(Point(),p[from])+dist(p[from],p[i])+dist(p[i],Point())+solve(from+1,i-1)+solve(i+1,to));
        c^=1;
    }

    if(ok[from][to])dp[from][to]=min(dp[from][to],solve(from+1,to-1)+dist(Point(),p[from])+dist(Point(),p[to])+dist(p[from],p[to]));

    return dp[from][to];
}


int main()
{
    ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>p[i].x>>p[i].y;
    }

    sort(p+1,p+1+n,cmp);

    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(i==j)continue;
            ok[i][j]=true;
            for(int k=1;k<=n;k++){
                if(i!=k&&j!=k){
                    if(intersect(p[i],p[j],p[k],Point()))ok[i][j]=false;
                }
            }
        }
    }

    for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)dp[i][j]=INF;

    cout<<fixed<<setprecision(6)<<solve(1,n);
    return 0;
}
