3664-顺序表应用7:最大子段和之分治递归法

来源:互联网 发布:淘宝免单活动在哪里看 编辑:程序博客网 时间:2024/06/05 14:34
#include<stdio.h>#include<algorithm>#include<iostream>#include<string.h>using namespace std;const int MAX = 50000+10;int maxx, cnt, n, a[MAX];int maxsum(int l, int r){    int sum = 0;    cnt++;    if(l==r)    {        if(a[l]>=0)sum = a[l];        else sum = 0;    }    else    {        int mid = (l+r)/2;        int leftsum = maxsum(l, mid);        int rightsum = maxsum(mid+1, r);        int s1, s2, ss;        s1 = ss = 0;        for(int i = mid; i>=l; --i)        {            ss+=a[i];            if(ss>s1)s1 = ss;        }        s2 = ss = 0;        for(int i = mid+1; i<=r; ++i)        {            ss+=a[i];            if(ss>s2)s2 = ss;        }        sum = s1+s2;        sum = max(sum, leftsum);        sum = max(sum, rightsum);    }    return sum;}int main(){    scanf("%d",&n);    for(int i = 0; i<n; ++i)        scanf("%d", &a[i]);    cnt = 0;    maxx = maxsum(0, n-1);    printf("%d %d\n", maxx, cnt);    return 0;}
阅读全文
0 0
原创粉丝点击