POJ 2479 Maximum sum DP

#include<stdio.h>
#include<string.h>
int a[50003];
int f[50003], g[50003];
#define inf 1000000000
int max(int a, int b) { return a > b ? a : b;}
int main()
{
    int i, j, cas, n;
    scanf("%d", &cas);
    while(cas--)
    {
        scanf("%d", &n);
        for(i = 1; i <= n; i++)
            scanf("%d", &a[i]);
        for(i = 0; i <= n; i++)
            f[i] = g[i] = -inf;
        int sum = 0;
        for(i = 1; i <= n; i++)
        {
            sum += a[i];    
            f[i] = max(sum, f[i-1]);
            if(sum < 0) sum = 0;
        }
        sum = 0;
        for(i = n; i >= 1; i--)
        {
            sum += a[i];
            g[i] = max(sum, g[i-1]);
            if(sum < 0) sum = 0;
        }
        int ans = -inf;
        for(i = 1; i < n; i++)
            if(ans < f[i] + g[i+1]) ans = f[i] + g[i+1];
        printf("%d\n", ans);
    }
    return 0;
}

你可能感兴趣的:(POJ 2479 Maximum sum DP)