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

这里写图片描述


#include <stdio.h>
#include <stdlib.h>

int count=0;
//定义全局变量用来记录递归次数
typedef struct{
    int data[50010];
    int length;
}List;

int Create(List *L){
    int i;
    for(i=0;i<L->length;i++){
        scanf("%d",&L->data[i]);
    }
}

int max(int a,int b){
    if(a>b)return a;
    else return b;
}
//C语言中的max函数需要自己补充
int Maxsum(List *L,int l,int r){
    int sum=0;
    if(l==r){
        if(L->data[l]>0)
            sum=L->data[l];
        else sum=0;
    }
    else {
        int mid=(l+r)/2;
        int leftsum;
        leftsum=Maxsum(L,l,mid);
        int rightsum;
        rightsum=Maxsum(L,mid+1,r);
        int i,Maxhe=0,he=0;
        for(i=l;i<=r;i++){
            he+=L->data[i];
            if(he<0)he=0;
            if(he>Maxhe)Maxhe=he;
        }
        sum=Maxhe;
        sum=max(sum,leftsum);
        sum=max(sum,rightsum);
    }
    count++;
    return sum;
}

int main()
{
    List *L=(List *)malloc(sizeof(List));
    scanf("%d",&L->length);
    Create(L);
    int Max_sum;
    Max_sum=Maxsum(L,0,L->length-1);
    printf("%d %d",Max_sum,count);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43191910/article/details/82728447