poj 2479 2593 最大字段和

来源:互联网 发布:山东招宝万金网络 编辑:程序博客网 时间:2024/06/06 12:25
poj2479
Maximum sum
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 37842 Accepted: 11827

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. 

需要注意这个算法的是:

对于求最大字段和的时候:若是a[ i ]<0 也是灭有关系的,因为要是前面的和也是小于0 的,那么下一个也是小于0 的

要是前面字段和不是小于0 ,那么字段和就会有下降,所以后面的一个循环可以取最大的值,直接就掩盖了小于0 的缺陷

#include<stdio.h>#include<algorithm>using namespace std;int a[50001];int left[50001];int right[50001];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]);//---------------左字段最大--------------------//        left[0]=a[0];        for(int i=1;i<n;i++)            if(left[i-1]<0)                left[i]=a[i];            else                left[i]=a[i]+left[i-1];        for(int i=1;i<n;i++)            left[i]=max(left[i],left[i-1]);  //---------------右字段最大--------------------//        right[n-1]=a[n-1];        for(int j=n-2;j>=0;j--)            if(right[j+1]<0)                right[j]=a[j];            else                right[j]=a[j]+right[j+1];        for(int j=n-2;j>=0;j--)            right[j]=max(right[j],right[j+1]);//---------------得出所需要的答案--------------------//        int ans=-0xfffffff;        for(int i=1;i<n;i++)            ans=max(ans,right[i]+left[i-1]);        printf("%d\n",ans);    }    return 0;}


poj2593

Description

Give you N integers a1, a2 ... aN (|ai| <=1000, 1 <= i <= N). 

You should output S. 

Input

The input will consist of several test cases. For each test case, one integer N (2 <= N <= 100000) is given in the first line. Second line contains N integers. The input is terminated by a single line with N = 0.

Output

For each test of the input, print a line containing S.

Sample Input

5-5 9 -5 11 200

Sample Output

40
#include<stdio.h>  #include<algorithm>  using namespace std;    const int MAX=100005;    int a[MAX];  int b[MAX];    int main()  {      int n;      while(scanf("%d",&n),n)      {          for(int i=0;i<n;i++)              scanf("%d",&a[i]);            int temp=0;          int ans=-0xfffffff;          for(int i=0;i<n;i++){              temp+=a[i];              if(temp>ans)                  ans=temp;              if(temp<0)                  temp=0;              b[i]=ans;          }            ans=-0xfffffff;          temp=0;          int bug=-0xfffffff;          for(int i=n-1;i>0;i--){              temp+=a[i];              if(temp>ans)                  ans=temp;              if(temp<0)                  temp=0;              bug=max(bug,ans+b[i-1]);          }          printf("%d\n",bug);        }      return 0;  }  


0 0
原创粉丝点击