POJ 2479 DP

    [POJ 2479](http://poj.org/problem?id=2479%20POJ%202479)
    题意: 对一个数列中的两个不相交的子区间A和B 找到两个区间和的最大值S

    在DP求最长子段和的时候 维护当前最大和
    LEFT[i]为1~i中最大和
    RIGHT[i] 为i~n中最大和
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#define sf scanf
#define pf printf
using namespace std;
const int maxn = 50000 + 5;

int num[maxn];
int LEFT[maxn],RIGHT[maxn];
int main(){
//    freopen("read.txt","r",stdin);
    int T;
    sf("%d",&T);
    while( T-- ){
        int n;sf("%d",&n);
        for(int i = 0;i < n;++i){
            sf("%d",&num[i]);
        }

        int MAX = num[0],sum = 0;
        for(int i = 0;i < n;++i){
            if(sum < 0){
                sum = num[i];
            }else sum = sum + num[i];
            MAX = max(MAX,sum);
            LEFT[i] = MAX;
        }
        MAX = num[n - 1],sum = 0;
        for(int i = n - 1;i >= 0;--i){
            if(sum < 0){
                sum = num[i];
            }else sum = sum + num[i];
            MAX = max(MAX,sum);
            RIGHT[i] = MAX;
        }
        int ans = LEFT[0] + RIGHT[1];
        for(int i = 0;i < n - 1;++i){
            ans = max(ans,LEFT[i] + RIGHT[i + 1]);
        }

        printf("%d\n",ans);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值