动态规划最大连续子序列

题目链接:http://poj.org/problem?id=2479

题目大意:给你一个数组, 输出两个不相交的连续子数组的最大和。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <set>
#include <map>
#include <vector>
#define LL long long 
using namespace std;

LL a[50010], l[50010], r[50010];// l[i] 以 i 结束的最大和 ; r[i] 以 i 开始的最大和。
int max(int a, int b)
{
    return a > b ? a : b;
}
int main()
{    
    int t, n, i;
    scanf("%d", &t);
    while(t--)
    {
        scanf("%d", &n);
        for(i = 1; i <= n; i++)
            scanf("%lld", &a[i]);
        l[1] = a[1];
        for(i = 2; i <= n; i++){
            l[i] = max(l[i - 1] + a[i], a[i]);
            //cout<< l[i] << " ";
        }
        r[n] = a[n];
        //cout << endl;
        for(i = n - 1; i > 0; i--){
            r[i] = max(a[i], r[i + 1] + a[i]);
            //cout << r[i] << " ";
        }
        //cout << endl;
        for(i = 2; i <= n; i++)
            l[i] = max(l[i - 1], l[i]);
        for(i = n - 1; i > 0; i--)
            r[i] = max(r[i + 1], r[i]);
        LL sum = l[1] + r[2];
        for(i = 2; i < n; i++){
            //cout << l[i] + r[i + 1]<< " ";
            if(l[i] + r[i + 1] > sum)
                sum = l[i] + r[i + 1];
        }
        printf("%lld\n", sum);
    }
    return 0;
}

 

posted @ 2016-04-25 22:37  海无泪  阅读(175)  评论(0编辑  收藏  举报