题意:你可以反转a数组的至多一段区间,求最大的Σaibi

先求一个不反转的前缀和,ans=sum[n],枚举反转区间的中心和反转区间的长度,统计反转部分的和.
ans=max(ans,反转部分的和-该区间原和+sum[n]);
复杂度O(n^2)

```
#include<bits stdc++.h>
using namespace std;
long long a[10010],b[10010];
long long sum[10010];
long long n;
inline long long maxmy(long long a,long long b)
{
return a>b?a:b;
}
int main()
{
cin>>n;
for(long long i=1;i<=n;++i)
{
cin>>a[i];
}
for(long long i=1;i<=n;++i)
{
cin>>b[i];
}
for(long long i=1;i<=n;++i)
{
sum[i]=sum[i-1]+a[i]*b[i];
}
long long ans=sum[n];

long long cnt,len;
for(long long i=1;i&lt;=n;++i)
{
    cnt=0;
    for(len=0;i-len&gt;=1&amp;&amp;i+len&lt;=n;++len)
    {
        cnt+=a[i+len]*b[i-len]+a[i-len]*b[i+len];
        if(len==0) cnt-=a[i]*b[i];
        ans=maxmy(ans,cnt+sum[n]-(sum[i+len]-sum[i-len-1]));
        //cout&lt;<i-len<<' '<<i+len<<' '<<cnt<<' '<<sum[n]<<' '<<(sum[i+len]-sum[i-len-1])<<endl; } cnt="0;" for(len="1;i-len+1">=1 &amp;&amp; i+len&lt;=n;++len)
    {
        cnt+=a[i-len+1]*b[i+len]+a[i+len]*b[i-len+1];
        ans=maxmy(ans,cnt+sum[n]-(sum[i+len]-sum[i-len]));
    }
}
cout&lt;</i-len<<'></bits>