姹傛渶闀垮瓙孌靛拰闂錛屼絾鏄槸姹備袱孌電殑瀛愭鍜屻?/p>
涔熷氨鏄姣忎釜i鏉ヨ錛屾眰鍑篬0~i-1]鐨勬渶澶у瓙孌靛拰浠ュ強(qiáng)[i~n-1]鐨勬渶澶у瓙孌靛拰錛屽啀鐩稿姞璧鋒潵銆?/p>
姹傛渶澶х殑涓涓氨琛屼簡銆?/p>
[0~i-1]鐨勬渶澶у瓙孌靛拰浠庡乏鍚戝彸鎵弿錛孾i~n-1]浠庡彸鍚戝乏鎵弿鍗沖彲銆?/p>
鏃墮棿澶嶆潅搴︿負(fù)O(n).
鍦ㄨ緭鍏ョ殑鏃跺欙紝寮濮嬬敤鐨勬槸iostream錛岀粨鏋滆秴鏃訛紝瑕佺敤scanf銆?97ms...
#include <cstdio>
#include <algorithm>
using namespace std;
int v[50001];
int left[50001];
int right[50001];
void solve()
{
int casessize;
scanf("%d",&casessize);
while(casessize--){
int size;
scanf("%d",&size);
for(int i=0;i<size;++i)
scanf("%d",&v[i]);
// 姝ゆ椂left[i] 涓哄寘鍚玦鏈澶у瓙孌靛拰
left[0] = v[0];
for(int i=1;i<size;++i){
if(left[i-1]<0)
left[i] = v[i];
else
left[i] = left[i-1]+v[i];
}
// 姝ゆ椂left[i] 涓篿宸﹁竟鏈澶у瓙孌靛拰
for(int i=1;i<size;++i)
left[i] = max(left[i],left[i-1]);
right[size-1] = v[size-1];
for(int j=size-2;j>=0;j--){
if(right[j+1]<0)
right[j] = v[j];
else
right[j] = right[j+1]+v[j];
}
for(int i=size-2;i>=0;i--)
right[i] = max(right[i+1],right[i]);
int res = INT_MIN;
for(int i=1;i<size;++i){
res = max(res,left[i-1]+right[i]);
}
printf("%d\n",res);
}
}
int main()
{
solve();
return 0;
}

]]>