题意:你可以反转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<=n;++i) { cnt=0; for(len=0;i-len>=1&&i+len<=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<<i-len<<' '<<i+len<<' '<<cnt<<' '<<sum[n]<<' '<<(sum[i+len]-sum[i-len-1])<<endl; } cnt="0;" for(len="1;i-len+1">=1 && i+len<=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<</i-len<<'></bits>