POJ 2479 Maximum sum

来源:互联网 发布:linux vi创建文件 编辑:程序博客网 时间:2024/06/06 09:23

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.

此题思路不算复杂,就是把序列分为两个方向,先自左向右依次找至当前位置的最大和,存到dp1里,然后自右向左依次找至当前位置的最大和,存到dp2里,然后依次把dp1和dp2的对应位置相加,找到最终的最大值即可,代码如下:


#include <iostream>#include <cstdio>using namespace std;long long dp[2][50010];int num[50010];const long long INF=((long long)1<<63);int main(){//ios::sync_with_stdio(false);int t,n;scanf("%d",&t);while(t--){scanf("%d",&n);for(int i=0;i<n;i++)scanf("%d",&num[i]);int i;long long sum,maxn;for(sum=i=0,maxn=INF;i<n;i++)//从左记录最大值{sum+=num[i];maxn=max(maxn,sum);if(sum<0)sum=0;dp[0][i]=maxn;}for(sum=0,i=n-1,maxn=INF;i>=0;i--)//从右记录最大值{sum+=num[i];maxn=max(maxn,sum);if(sum<0)sum=0;dp[1][i]=maxn;}for(i=1,sum=INF;i<n;i++)//依次加和获得最终最大值sum=max(sum,dp[0][i-1]+dp[1][i]);printf("%lld\n",sum);}return 0;}


0 0
原创粉丝点击