题目链接:D. Maximum Sum of Products
#include<bits/stdc++.h>
using namespace std;
const int maxn=5e3+5;
long long a[maxn],b[maxn];
long long dp[maxn][maxn];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
long long sum=0;
for(int i=1;i<=n;i++)
{
cin>>b[i];
sum+=a[i]*b[i];//计算未反转前的总和
}
long long mx=0;
//类似于区间dp,找出反转后差值最大的值
for(int l=n;l>=1;l--)
//这里从n到1的原因是因为状态转移是从dp[l+1][r-1]到dp[l][r]的,所以需要从n到1
for(int r=l+1;r<=n;r++)
{
dp[l][r]=dp[l+1][r-1]-a[l]*b[l]-a[r]*b[r]+a[l]*b[r]+a[r]*b[l];
//a[l] a[r]反转后变为a[r] a[l],那么差值为a[r]*b[l]+a[l]*b[r]-a[l]*b[l]-a[r]*b[r]
//b[l] b[r] b[l] b[r]
//反转两头,计算出差值
mx=max(mx,dp[l][r]);
}
cout<<mx+sum<<endl;
//答案为未反转欠的总和加上反转后的差值
}
//2 3 2 1 3
//1 3 2 4 2
//2 3 3 2 1