本题典型的动态规划,求得两个不相交连续字段和的最大值,所以这里我们需要明白,求两个字段和,一个是到i的字段和最大值,还有一个是从i开始的字段和最大值,以此来求解即可;AC代码如下:
#include#include #include 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< } printf("%lldn",ans); } return 0; }
题解持续更新,有问题请私聊



