Maximum sum

来源:互联网 发布:卖家怎么加入爱淘宝 编辑:程序博客网 时间:2024/06/06 01:01
总时间限制: 
1000ms 
内存限制: 
65536kB
描述
Given a set of n integers: A={a1, a2,..., an}, we define a function d(A) as below:
                     t1     t2          d(A) = max{ ∑ai + ∑aj | 1 <= s1 <= t1 < s2 <= t2 <= n }                    i=s1   j=s2

Your task is to calculate d(A).
输入
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.
输出
Print exactly one line for each test case. The line should contain the integer d(A).
样例输入
1101 -1 2 2 3 -3 4 -4 5 -5
样例输出
13
提示
In the sample, we choose {2,2,3,-3,4} and {5}, then we can get the answer.

Huge input,scanf is recommended.
来源

POJ Contest,Author:Mathematica@ZSU

求两个子序和使之和最大,f1[i]表示前向计算到达i点时子序列最大值,f2[i]表示后向前计算到达i点时子序列最大值,最后再统计相邻两节点的和f1+f2

#include <bits/stdc++.h>using namespace std;int a[50005];int f1[50005], f2[50005];int n, T;int main(){    cin >> T;    while(T--)    {        cin >> n;        memset(f1, 0, sizeof(f1));        memset(f2, 0, sizeof(f2));        for(int i = 0; i < n; i++) cin >> a[i];        int maxn = a[0];        int sum = 0;        for(int i = 0; i < n; i++)        {            sum += a[i];            if(sum > maxn) maxn = sum;            if(sum < 0) sum = 0;            f1[i] = maxn;        }        sum = 0; maxn = a[n-1];        for(int i = n-1; i >= 0; i--)        {            sum += a[i];            if(sum > maxn) maxn = sum;            if(sum < 0) sum = 0;            f2[i] = maxn;        }        int ans = -0x7fffffff;        for(int i = 0; i < n-1; i++)            ans = max(ans, f1[i]+f2[i+1]);        cout << ans << endl;    }    return 0;}


原创粉丝点击