顺序表应用7:最大子段和之分治递归法 Time Limit: 10MS Memory Limit: 400KB Submit Statistic Problem Description 给定n(1<=n<=50000)个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时定义子

# include<stdio.h>
typedef struct
{
    int a[55000];
}list;
int x=0;
int maxsum(list *p, int l, int r)
{
    int i, s1=0, s2=0, maxl, maxr, mid, sum=0;
    x++;
    if(l==r)
    {
        if(p->a[l]>=0)
            sum=p->a[l];
        else
            sum=0;
    }
    else
    {
        mid=(l+r)/2;
       maxl=maxsum(p, l, mid);
       maxr=maxsum(p, mid+1, r);
       int t=0;
       for(i=mid; i>=l; i--)
       {
           t += p->a[i];
           if(s1<t)
            s1=t;
       }
       t=0;
       for(i=mid+1; i<=r; i++)
       {
           t += p->a[i];
           if(s2<t)
            s2=t;
       }
       sum=s1+s2;
       if(sum<maxl)
        sum=maxl;
       if(sum<maxr)
        sum=maxr;
    }
    return sum;
}
int main()
{
    int n, i, sum;
    list p;
    scanf("%d", &n);
    for(i=0; i<n; i++)
    {
        scanf("%d", &p.a[i]);
    }
    sum=maxsum(&p, 0, n-1);
    printf("%d %d\n", sum, x);
    return 0;
}

posted @ 2017-09-20 18:59  WAITINGMEZZY  阅读(938)  评论(0)    收藏  举报