连接:http://poj.org/problem?id=2479
思路:在输入的同时,进行一次DP,计算出从左到右的最大值,并把它保存在数组dp的对应的下标元素中,这样之后,对于下标为i的元素,它其中保存的便是前面所 有元素可能的最大连续和。再从右到左进行一次DP,计算从右到左的最大连续和。假设此时已经算到下标为i的元素,那么将sum+dp[i-1]与ans进 行比较,将ans取较大者。最后当i到2的时候ans中的值即为所求的最大值。
#include <iostream>
using namespace std;
int array[50001], num[50001];
const int MIN = -999999999;
int main()
{
int tcase, n;
cin>>tcase;
int tmp, ans, i, sum;
while(tcase--){
scanf("%d", &n);
tmp = MIN; sum = 0;
for(i = 1; i <= n; i++){
scanf("%d", &num[i]);
sum += num[i];
if(sum > tmp)
tmp = sum;
array[i] = tmp;
if(sum < 0)
sum = 0;
}
tmp = ans = MIN;
sum = 0;
for(i = n; i > 1; i--){
sum += num[i];
if(sum > tmp)
tmp = sum;
if(ans < (array[i-1]+tmp))
ans = array[i-1]+tmp;
if(sum < 0)
sum = 0;
}
cout<<ans<<endl;
}
return 0;
}