//  #牛客春招刷题训练营# https://www.nowcoder.com/discuss/726480854079250432
//  最近写的都是这种题,枚举len的dp
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#define pre(i,j,k) for (int i = j; i < k; i++)
using namespace std;
int ans = 0;
int main() {
  ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0);
  int n;
  cin >> n;
  vector<int> a(n);
  pre(i, 0, n) cin >> a[i];
  vector<int> b(n);
  pre(i, 0, n) cin >> b[i];
  vector<vector<int>> dp(n, vector<int>(n, 0));
  pre(len, 1, n + 1){
    pre(i, 0, n){
      int j = i + len - 1;
      if (j >= n) break;
      if (i == j) dp[i][j] = a[i] * b[n - 1];//--------ps:这里别写成len-1了,虽然也能过4组样例
      else{
        dp[i][j] = max(dp[i][j - 1] + a[j] * b[n - len], dp[i + 1][j] + a[i] * b[n - len]);
		//------推导我是反过来看的看成一次放一个只能放在队列的左右两边,虽然情况不完全一样
      }
    }
  }
  cout << dp[0][n - 1];
  return 0;
}
// 64 位输出请用 printf("%lld")