您的位置:首页 > 其它

POJ 2479 - Maximum sum(线性DP)

2014-10-10 21:58 357 查看
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

1

10
1 -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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  DP POJ