题目地址:http://poj.org/problem?id=2479
思路:先从前往后扫一遍最大字段和,再从后往前加上从前往后的最大字段和,即可求出2个最大的字段和
AC代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
#include <cmath>
#include <cctype>
const int inf = 0x7f7f7f7f;//2139062143
typedef long long ll;
using namespace std;
int a[50010];
int dp[50010];
int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
int max = -10010;
scanf("%d",&n);
for(int i=0; i<n; i++)
{
scanf("%d",&a[i]);
}
int sum = 0;
for(int i=0; i<n; i++)
{
sum += a[i];
if(sum > max)
{
max = sum;
}
dp[i] = max;
if(sum < 0)
{
sum = 0;
}
}
max = -10010;
int max1 = -inf;
sum = 0;
for(int i=n-1; i>0; i--)
{
sum += a[i];
if(sum > max)
{
max = sum;
}
if(dp[i-1] + max > max1)
{
max1 = dp[i-1] + max;
}
if(sum < 0)
{
sum = 0;
}
}
printf("%d\n",max1);
}
return 0;
}