一个数组,最多只能反转一次连续子数组,求偶数位和的最大值
难得能直接看出来的dp,感谢case提示的第二种反转方法
等数位板到了补图
#pragma GCC diagnostic error "-std=c++11"
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define ll long long
#define Pair pair<int,int>
#define re return
#define getLen(name,index) name[index].size()
#define mem(a,b) memset(a,b,sizeof(a))
#define Make(a,b) make_pair(a,b)
#define Push(num) push_back(num)
#define rep(index,star,finish) for(register int index=star;index<finish;index++)
#define drep(index,finish,star) for(register int index=finish;index>=star;index--)
using namespace std;
template<class T> void _deb(const char *name,T val){
cout<<name<<val<<endl;
}
const int maxn=2e5+10;
int t;
ll store[maxn];
ll dp[maxn][3];
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cin>>t;
while(t--){
int n;
cin>>n;
rep(i,0,n)
cin>>store[i];
store[n]=0;
dp[0][0]=store[0],dp[0][1]=store[1],dp[0][2]=0;;
rep(i,1,(n+1)/2){
ll &oddNum=store[i*2+1],&evenNum=store[i*2];
dp[i][0]=dp[i-1][0]+evenNum;
dp[i][1]=max(dp[i-1][0]+oddNum,dp[i-1][1]+oddNum);
dp[i][2]=max(dp[i-1][1]+evenNum,dp[i-1][2]+evenNum);
// cout<<dp[i][0]<<"\t"<<dp[i][1]<<"\t"<<dp[i][2]<<endl;
}
ll ans=0;
rep(i,0,3)
ans=max(ans,dp[(n+1)/2-1][i]);
dp[0][0]=store[0],dp[0][1]=0,dp[0][2]=0;;
rep(i,1,(n+1)/2){
ll &oddNum=store[i*2-1],&evenNum=store[i*2];
dp[i][0]=dp[i-1][0]+evenNum;
dp[i][1]=max(dp[i-1][0]+oddNum,dp[i-1][1]+oddNum);
dp[i][2]=max(dp[i-1][1]+evenNum,dp[i-1][2]+evenNum);
// cout<<dp[i][0]<<"\t"<<dp[i][1]<<"\t"<<dp[i][2]<<endl;
}
rep(i,0,3)
ans=max(ans,dp[(n+1)/2-1][i]);
cout<<ans<<endl;
}
re 0;
}