POJ 2479 Maximum sum

来源:互联网 发布:网络写手如何投稿 编辑:程序博客网 时间:2024/05/22 06:56
Maximum sum
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 34502 Accepted: 10692

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.


  杭电1003的加强版!


  用两个数组记录,一个从开始位置到当前位置最大的连续和,另一个是从结尾到当前位置最大的连续和,最后再遍历一遍前面最大和+后面最大和


代码:

#include <iostream>#include <cstdio>#include <algorithm>using namespace std;const int maxn=50000+100;int a[maxn];long long sum1[maxn];long long sum2[maxn];int main(){    int t;    scanf("%d",&t);    while(t--)    {        int n;        scanf("%d",&n);        for(int i=0; i<n; i++)        {            scanf("%d",&a[i]);        }        long long ans=a[0]+a[n-1];        long long ans1=a[0],temp1=0,temp2=0,ans2=a[n-1];        for(int i=0; i<n; i++)//起点到当前位置最大的连续和        {            temp1=temp1+a[i];            if(temp1>ans1)            {                ans1=temp1;            }            if(temp1<0)            temp1=0;            sum1[i]=ans1;        }        for(int i=n-1; i>=0; i--)//结尾到当前位置最大的连续和        {            temp2=temp2+a[i];            if(temp2>ans2)                ans2=temp2;            if(temp2<0)                temp2=0;            sum2[i]=ans2;        }        for(int i=0; i<n-1; i++)            ans=max(ans,sum1[i]+sum2[i+1]);        printf("%lld\n",ans);    }    return 0;}


0 0
原创粉丝点击