#include <bits/stdc++.h>
using namespace std;
void maximize(double &a, double b) { a = max(a, b); }
const int limit = 2505;
double sq(double x) { return x * x; }
int n;
complex<double> read() {
  double x, y;
  cin >> x >> y;
  return complex<double>(x, y);
}
double posx[limit], posy[limit];
double dist[limit][limit];
double memcompute[limit][limit][2];
char computed[limit][limit][2];
double compute(int u, int v, int dir) {
  double &mem = memcompute[u][v][dir];
  char &com = computed[u][v][dir];
  if (com) return mem;
  com = 1;
  int DIR;
  if (dir == 0)
    DIR = -1;
  else
    DIR = 1;
  int nextu = (u - DIR + n) % n;
  int nextv = (v + DIR + n) % n;
  if (nextu == v) return mem;
  mem = max(
      dist[v][nextv] + compute(u, nextv, dir),
      max(dist[v][nextu] + compute(v, nextu, 1 - dir), compute(nextu, v, dir)));
  return mem;
}
double sol;
int main() {
  cout.setf(ios::fixed);
  cout.precision(12);
  ios::sync_with_stdio(false);
  cin >> n;
  for (int i = 0; i < n; i++) cin >> posx[i] >> posy[i];
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
      dist[i][j] = sqrt(sq(posx[i] - posx[j]) + sq(posy[i] - posy[j]));
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
      if (i != j)
        for (int dir = 0; dir <= 1; dir++)
          maximize(sol, dist[i][j] + compute(i, j, dir));
  cout << sol << endl;
}
