POJ 2479 - Maximum sum(线性DP)

来源:互联网 发布:java ee 6 源码 编辑:程序博客网 时间:2024/06/06 17:18

Description

Given a set of n integers: A={a1, a2,..., an}, we define a function d(A) as below:
Your task is to calculate d(A).

Input

The input consists of T(<=30) test cases. The number of test cases (T) is given in the first line of the input.
Each test case contains two lines. The first line is an integer n(2<=n<=50000). The second line contains n integers: a1, a2, ..., an. (|ai| <= 10000).There is an empty line after each case.

Output

Print exactly one line for each test case. The line should contain the integer d(A).

Sample Input

1101 -1 2 2 3 -3 4 -4 5 -5

Sample Output

13

Hint

In the sample, we choose {2,2,3,-3,4} and {5}, then we can get the answer.

Huge input,scanf is recommended.

                                                                     

题意:

求出得到两段子序列 和最大。

思路;

l[i] 记录从0到i 最大的子序列的和,r[i] 记录从i 到n-1的子序列最大和。

CODE:

#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>#include <string>#include <cstring>#include <queue>#include <stack>#include <vector>#include <set>#include <map>const int inf=0xfffffff;typedef long long ll;using namespace std;int num[50005];int l[50005], r[50005];int main(){    int T;    scanf("%d", &T);    while(T--){        int n;        scanf("%d", &n);        for(int i = 0; i < n; ++i){            scanf("%d", &num[i]);        }        l[0] = num[0];        for(int i = 1; i < n; ++i){            if(l[i - 1] < 0){                l[i] = num[i];            }            else l[i] = l[i - 1] + num[i];        }        for(int i = 1; i < n; i++){            l[i] = max(l[i], l[i - 1]);        }        r[n - 1] = num[n - 1];        for(int i = n - 2; i >= 0; --i){            if(r[i + 1] < 0){                r[i] = num[i];            }            else r[i] = r[i + 1] + num[i];        }        for(int i = n - 2; i >= 0; --i){            r[i] = max(r[i], r[i + 1]);        }        int ans = -inf;        for(int i = 1; i < n; ++i){            ans = max(ans, l[i - 1] + r[i]);        }        printf("%d\n", ans);    }    return 0;}


0 0