本题典型的动态规划,求得两个不相交连续字段和的最大值,所以这里我们需要明白,求两个字段和,一个是到i的字段和最大值,还有一个是从i开始的字段和最大值,以此来求解即可;AC代码如下:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
long long a[50005];
long long n;
long long f_i[50005];
long long i_f[50005];
int main(){
int t;
scanf("%d",&t);
while(t--){
memset(f_i,-0x3f3f3f3f,sizeof(f_i));
memset(i_f,-0x3f3f3f3f,sizeof(i_f));
scanf("%lld",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
for(int i=1;i<=n;i++)
f_i[i]=max(f_i[i-1]+a[i],a[i]);
for(int i=n;i>=1;i--)
i_f[i]=max(i_f[i+1]+a[i],a[i]);
for(int i=1;i<=n;i++)
f_i[i]=max(f_i[i-1],f_i[i]);
for(int i=n;i>=1;i--)
i_f[i]=max(i_f[i+1],i_f[i]);
long long ans=-0x3f3f3f3f;
for(int i=1;i<=n;i++){
ans=max(ans,max(max(f_i[i]+i_f[i+1],f_i[i-1]+i_f[i]),f_i[i-1]+i_f[i+1]));
//cout<<ans<<" ";
}
printf("%lld\n",ans);
}
return 0;
}
题解持续更新,有问题请私聊