题目链接点这里
题目大意是给你两个二维数组a和b(同长),可以翻转一次a数组的任意子片段;要你求最大的a、b数组对应乘积之和。即翻转后的a1* b1+a2* b2+a3* b3+…+an* bn的最大值。
代码如下:
# include <iostream>
# include <algorithm>
using namespace std;
typedef long long LL;
LL a[5010], b[5010];
LL pr[5010];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++) cin>>b[i];
for(int i=0;i<n;i++)//求前缀和
{
pr[i+1] = pr[i]+a[i]*b[i];
}
LL ans = pr[n];//原始答案
for(int i=0;i<n;i++)
{
LL cnt = a[i]*b[i];
for(int l = i-1, r = i+1;l>=0&&r<n;l--, r++)
{//翻转片段奇数长
cnt += a[l]*b[r];
cnt += a[r]*b[l];
ans = max(ans, cnt+pr[l]+(pr[n]-pr[r+1]));
//注意这里要补齐整个cnt(利用前缀和),下同
}
cnt = 0;
for(int l = i, r = i+1;l>=0&&r<n;l--, r++)
{//翻转片段偶数长
cnt += a[l]*b[r];
cnt += a[r]*b[l];
ans = max(ans, cnt+pr[l]+(pr[n]-pr[r+1]));
}
}
cout<<ans<<endl;//输出所有更新后的最大答案
return 0;
}