func_code_string: #pragma GCC optimize( O3 )   #pragma GCC target( sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx )       #include <iostream>   #include <cstdio>   #include <vector>   #include <set>   #include <map>   #include <string>   #include <cstring>   #include <cstdlib>   #include <algorithm>   #include <cassert>   #include <cmath>   #include <queue>   #include <ctime>   #include <unordered_map>   #include <unordered_set>   #include <sstream>       using namespace std;       #define REP(i, n) for(int (i) = 0; (i) < (n); (i)++)   #define SZ(a) (int)(a).size()   #define ALL(a) (a).begin(), (a).end()      const int N = 5005;   long long a[N], b[N], d[N];   short e[N][N];   vector<long long> c[2 * N];       int main() {    ios::sync_with_stdio(false);    cin.tie(nullptr);    int n;    cin >> n;    REP(i, n) cin >> a[i];    REP(i, n) cin >> b[i];    REP(i, n) {     int aidx = i, bidx = 0, cidx = i;     c[cidx].reserve(i + 2);     c[cidx].push_back(0);     while (aidx >= 0) {      e[aidx][bidx] = SZ(c[cidx]);      c[cidx].push_back(c[cidx].back() + a[aidx] * b[bidx]);      --aidx, ++bidx;     }    }    for (int i = 1; i < n; i++) {     int aidx = n - 1, bidx = i, cidx = n - 1 + i;     c[cidx].reserve(n - i + 1);     c[cidx].push_back(0);     while (bidx < n) {      e[aidx][bidx] = SZ(c[cidx]);      c[cidx].push_back(c[cidx].back() + a[aidx] * b[bidx]);      --aidx, ++bidx;     }    }    d[0] = 0;    for (int i = 1; i <= n; i++) {     d[i] = d[i - 1] + a[i - 1] * b[i - 1];    }    long long res = d[n];    REP(L, n) {     for (int R = L; R < n; R++) {      long long fs = d[n] - d[R + 1] + d[L];      int st = e[R][L], fn = e[L][R];      long long sc = c[L + R][fn] - c[L + R][st - 1];      res = max(res, fs + sc);     }    }    cout << res << endl;    return 0;   }