经典动态规划求最大子序和的问题,思路不算难,但是数据量比较大,这里应用一个小技巧
将dp的初始化大小始终设置为n+1的大小,这样能避免memset给许多不必要的下标内容赋值,可以减少时间复杂度
#include<bits/stdc++.h>
using namespace std;
const int M=2e5+5;
typedef long long ll;
ll a[M];
int main(){
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int t;
cin>>t;
while(t--){
int n; cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
ll dp[n+1];
memset(dp,0,sizeof(dp));
dp[1]=a[1];
ll ans=dp[1];
for(int i=2;i<=n;i++){
if(abs(a[i]%2)+abs(a[i-1]%2)==1){
dp[i]=max(a[i],dp[i-1]+a[i]);
ans=max(ans,dp[i]);
}
else
{
dp[i]=a[i];
ans=max(ans,dp[i]);
}
}
cout<<ans<<endl;
}
return 0;
}