#include <bits/stdc++.h>
using namespace std;
struct coordinate {
  int x;
  int y;
  double operator-(const coordinate& other) const {
    return sqrt(pow((x - other.x), 2) + pow((y - other.y), 2));
  }
  bool operator==(const coordinate& other) const {
    return (x == other.x && y == other.y);
  }
};
double dp[2505][2505][2];
vector<coordinate> input;
int n;
double solve(int thestart, int theend, int dir) {
  if ((dir == 0 ? (theend - thestart > 0 ? theend - thestart + 1
                                         : theend - thestart + n + 1)
                : (thestart - theend > 0 ? thestart - theend + 1
                                         : thestart - theend + n + 1)) == 2) {
    dp[thestart][theend][dir] = input.at(thestart) - input.at(theend);
    return dp[thestart][theend][dir];
  }
  int a = (thestart + 1) % n;
  int b = (thestart - 1 + n) % n;
  double themax = 0;
  if (dir == 0) {
    if (dp[a][theend][0] == 0) {
      solve(a, theend, 0);
    }
    if (dp[theend][a][1] == 0) {
      solve(theend, a, 1);
    }
    themax = max(input.at(thestart) - input.at(a) + dp[a][theend][0],
                 input.at(thestart) - input.at(theend) + dp[theend][a][1]);
  } else {
    if (dp[b][theend][1] == 0) {
      solve(b, theend, 1);
    }
    if (dp[theend][b][0] == 0) {
      solve(theend, b, 0);
    }
    themax = max(input.at(thestart) - input.at(b) + dp[b][theend][1],
                 input.at(thestart) - input.at(theend) + dp[theend][b][0]);
  }
  dp[thestart][theend][dir] = themax;
  return themax;
}
int main() {
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    int t1, t2;
    scanf("%d %d", &t1, &t2);
    input.push_back(coordinate{t1, t2});
  }
  double ans = -1;
  for (int i = 0; i < n; i++) {
    double temp = solve(i, (i + n - 1) % n, 0);
    if (temp > ans) ans = temp;
  }
  cout << setprecision(12) << ans << endl;
  return 0;
}
