您的位置:首页 > 其它

poj 2479 Maximum sum

2015-06-02 11:32 225 查看
Maximum sum

Time Limit: 1000MSMemory Limit: 65536K
Total Submissions: 35588Accepted: 11048
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.
Source
POJ Contest,Author:Mathematica@ZSU

最大子段和的变形,我的思路是从两个方向求该数列的最大字段和,然而我的dp方程f[i]=max(f[i-1]+f[i],f[i])保存的是以f[i]结束的最大子段和的值,一开始居然用了两重循环去找最大值。。。。果断TL了。。。。看了大神们的代码,发现大神们的f[i]保存的都是到f[i]为止之前所有的最大子段和里的最大值,无奈又处理了一下数组,终于过了。。。

代码:
#include <cstdio>
#include <iostream>
using namespace std;

int a[1000000],f1[1000000],f2[1000000];

int main()
{
    int t,n,Max;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            f1[i]=f2[i]=a[i];
        }
        Max=-1000000;
        for(int i=2;i<=n;i++)
        {
            f1[i]=max(f1[i],f1[i-1]+f1[i]);
            f2[n-i+1]=max(f2[n-i+1],f2[n-i+1]+f2[n-i+2]);
        }
        for(int i=2;i<=n;i++)
            f1[i]=max(f1[i],f1[i-1]);
        for(int i=n-1;i>=1;i--)
            f2[i]=max(f2[i],f2[i+1]);
        for(int i=2;i<=n;i++)
            Max=max(Max,f1[i-1]+f2[i]);
        printf("%d\n",Max);
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: