#include <bits/stdc++.h>
#pragma GCC optimize("Ofast", "unroll-loops")
using namespace std;
const int iinf = 1 << 29;
const long long inf = 1ll << 60;
const long long mod = 1e9 + 7;
void GG() {
  cout << "No\n";
  exit(0);
}
long long mpow(long long a, long long n) {
  long long re = 1;
  while (n > 0) {
    if (n & 1) re = re * a % mod;
    a = a * a % mod;
    n >>= 1;
  }
  return re;
}
long long inv(long long b) {
  if (b == 1) return b;
  return (mod - mod / b) * inv(mod % b) % mod;
}
const int maxn = 2503;
double dst[maxn][maxn];
int n;
double mem[maxn][maxn][2];
int first(int x) { return (x + n) % n; }
double dp(int l, int r, bool b) {
  if (mem[l][r][b]) return mem[l][r][b];
  if (first(l + 1) == r) return 0;
  if (!b) {
    mem[l][r][b] = max(dst[l][first(r - 1)] + dp(l, first(r - 1), 1),
                       dst[l][first(l + 1)] + dp(first(l + 1), r, 0));
  } else {
    mem[l][r][b] = max(dst[first(l + 1)][r] + dp(first(l + 1), r, 0),
                       dst[r][first(r - 1)] + dp(l, first(r - 1), 1));
  }
  return mem[l][r][b];
}
int main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin >> n;
  vector<pair<int, int> > v;
  for (int i = 0; i < (n); i++) {
    int x, y;
    cin >> x >> y;
    v.push_back({x, y});
  }
  for (int i = 0; i < (n); i++) {
    for (int j = 0; j < (n); j++) {
      dst[i][j] = hypot(v[i].first - v[j].first, v[i].second - v[j].second);
    }
  }
  double re = 0;
  for (int i = 0; i < (n); i++)
    for (int j = 0; j < (n); j++) {
      if (i != j) {
        re = max(re, (__typeof__(re))(dst[i][j] + dp(i, j, 0) + dp(j, i, 0)));
      }
    }
  cout << fixed << setprecision(12) << re << '\n';
}
