以
i
i
i为中点
先交换区间大小为3的
再交换区间大小为5的
再交换区间大小为7的
以此类推
这样是
O
(
n
)
O(n)
O(n)就能求出以
i
i
i为中点的所有翻转情况
总时间复杂度为
O
O
O(
n
2
n^2
n2)
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
using namespace std;
typedef long long ll;
const int N = 5e3 + 10;
int n, a[N], b[N];
ll sum;
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++)scanf("%d", &a[i]);
for (int i = 1; i <= n; i++)scanf("%d", &b[i]);
for (int i = 1; i <= n; i++)sum += (ll) a[i] * b[i];
ll res = sum;
for (int i = 1; i <= n; i++) {
ll s = sum;
for (int j = 1; j <= min(i - 1, n - i); j++) {//长度为奇数
int l = i - j, r = i + j;
s -= (ll) a[l] * b[l] + (ll) a[r] * b[r];
s += (ll) a[l] * b[r] + (ll) a[r] * b[l];
res = max(res, s);
}
s = sum;
for (int j = 1; j <= min(i - 1, n - i + 1); j++) {//长度为偶数
int l = i - j, r = i + j - 1;
s -= (ll) a[l] * b[l] + (ll) a[r] * b[r];
s += (ll) a[l] * b[r] + (ll) a[r] * b[l];
res = max(res, s);
}
}
cout << res << endl;
return 0;
}