题目链接: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