題意:
給定n個數,只能選擇一個子段然後翻轉,問偶數下標最大的和是多少?
解析:
這道題和最大子段和相似,但是多了一個翻轉一段子段。
而且這道題我們選擇子段的長度必須是偶數,(因爲如果長度是奇數的話,偶數下標對應還是原來的數).
我們先把原數組的偶數下標之和求出來。
然後我們用類似求最大子段和的方法來求出每個偶下標和奇下標翻轉對答案帶來的貢獻
首先如果是偶下標 ,那麼我們要和奇下標交換,說明奇下標的數比偶下標的數要大所以帶來的貢獻就是a[i-1]-a[i]+sum (之前的最大貢獻)
如果是奇下標 ,那麼我們要和偶下標交換,說明奇下標的數比偶下標的數要大所以帶來的貢獻就是a[i]-a[i-1]+sum (之前的最大貢獻)
最終答案就是:原數組偶數下標之和+奇偶下標交換帶來的貢獻
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10;
ll a[N];
int t,n;
int main()
{
cin>>t;
while(t--)
{
cin>>n;
ll ans=0;
for(int i=0;i<n;i++)
{
cin>>a[i];
if(i%2==0) ans+=a[i];
}
ll even=0,old=0,maxv=0;
for(int i=0;i<n;i+=2)
{
old=max(0ll,a[i-1]-a[i]+old);
maxv=max(maxv,old);
}
for(int i=1;i<n;i+=2)
{
even=max(0ll,a[i]-a[i-1]+even);
maxv=max(even,maxv);
}
cout<<ans+maxv<<endl;
}
}