// #牛客春招刷题训练营# 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")