func_code_string: #include <bits/stdc++.h>   using namespace std;   const int inf = (int)1e9 + 7;   const double pi = 3.14159265358979323846;   template <class T>   T sqr(T x) {     return x * x;   }   double len(const pair<int, int> &p1, const pair<int, int> &p2) {     return sqrt(sqr((long long)p1.first - p2.first) +                 sqr((long long)p1.second - p2.second));   }   double foo(const vector<pair<int, int>> &pol, int l, int r, bool side) {     static vector<vector<vector<double>>> dp(         2, vector<vector<double>>(2500, vector<double>(2501, -1)));     if (r <= l + 1) return 0;     if (l > (int)pol.size() / 2)       return foo(pol, l - (pol.size() + 1) / 2, r - (pol.size() + 1) / 2, side);     if (dp[side][l][r - l] == -1)       if (side)         dp[side][l][r - l] =             max(len(pol[r - 1], pol[l]) + foo(pol, l, r - 1, 0),                 len(pol[r - 1], pol[r - 2]) + foo(pol, l, r - 1, 1));       else         dp[side][l][r - l] = max(len(pol[l], pol[l + 1]) + foo(pol, l + 1, r, 0),                                  len(pol[l], pol[r - 1]) + foo(pol, l + 1, r, 1));     return dp[side][l][r - l];   }   int main() {     ios_base::sync_with_stdio(false);     cin.tie(NULL);     int n;     cin >> n;     vector<pair<int, int>> pol(n);     for (auto &it : pol) cin >> it.first >> it.second;     for (int i = 0; i < n - 1; i++) pol.push_back(pol[i]);     double best = numeric_limits<double>::lowest();     for (int i = 0; i < n - 1; i++)       best = max(best, max(foo(pol, i, i + n, 0), foo(pol, i, i + n, 1)));     cout.precision(20);     cout << fixed << best << endl;     return 0;   }   