#include <bits/stdc++.h>
using namespace std;
const int kMaxN = 2500 + 5;
int n;
double ans, dp1[kMaxN][kMaxN], dp2[kMaxN][kMaxN];
struct Node {
  double x;
  double y;
};
Node a[kMaxN];
inline double Dis(Node a, Node b) {
  return sqrt(pow((a.x - b.x), 2) + pow((a.y - b.y), 2));
}
inline int c(int x) { return (x + n) % n; }
inline int read() {
  int s = 0, w = 1;
  char ch = getchar();
  while ((ch < '0') || (ch > '9')) {
    if (ch == '-') {
      w = -1;
    }
    ch = getchar();
  }
  while ((ch >= '0') && (ch <= '9')) {
    s = s * 10 + ch - '0';
    ch = getchar();
  }
  return s * w;
}
#pragma GCC optimize("inline,Ofast", 3)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
int main() {
  n = read();
  for (int i = 0; i < n; i++) {
    int x, y;
    x = read();
    y = read();
    a[i].x = (double)x;
    a[i].y = (double)y;
  }
  for (int len = 2; len <= n; len++) {
    for (int l = 0; l < n; l++) {
      int r = c(l + len - 1);
      double a1 = dp1[c(l + 1)][r] + Dis(a[l], a[c(l + 1)]);
      double a2 = dp2[c(l + 1)][r] + Dis(a[l], a[r]);
      double a3 = dp1[l][c(r - 1)] + Dis(a[l], a[r]);
      double a4 = dp2[l][c(r - 1)] + Dis(a[c(r - 1)], a[r]);
      dp1[l][r] = max(a1, a2);
      dp2[l][r] = max(a3, a4);
    }
  }
  for (int i = 0; i < n; i++) {
    ans = max(ans, max(dp1[i][c(i + n - 1)], dp2[i][c(i + n - 1)]));
  }
  printf("%.12lf\n", ans);
  return 0;
}
