最大连续子序列和

一、三重循环
二、一的改进版:二重循环

三、分治法

//分治法
#include<stdio.h>
#include<stdlib.h>
#define LISTSIZE 50000

typedef struct
{
    int *elem;
    int length;
}Sqlist;
int Createlist(Sqlist *L,int n)
{
    L->elem=(int *)malloc(LISTSIZE*sizeof(int));
    if(!L->elem) return -1;
    int i;
    for(i=0;i<n;i++)
        scanf("%d",&L->elem[i]);
    L->length=n;
    return 0;
}
int Maxsum(int a[],int left,int right)
{
    int sum;
    if(left==right)
        return a[left];
    else
    {
        int mid=(left+right)/2;
        int leftsum=Maxsum(a,left,mid);  //左半边序列最大和
        int rightsum=Maxsum(a,mid+1,right);  //右半边序列最大和
        int i;
        int lefts=a[mid],sum1=a[mid];  //左半边的最右边
        for(i=mid-1;i>=left;i--)
        {
            lefts+=a[i];
            if(lefts>sum1)
                sum1=lefts;
        }
        int rights=a[mid+1],sum2=a[mid+1];  //右半边的最左边
        for(i=mid+2;i<=right;i++)
        {
            rights+=a[i];
            if(rights>sum2)
                sum2=rights;
        }
        sum=leftsum>rightsum?leftsum:rightsum;
        sum=sum>(sum1+sum2)?sum:(sum1+sum2);  //最后sum1与sum2相加得到横跨左右序列的最大和,分别与左右半边序列最大和比较
    }
    return sum;
}
void main()
{
    Sqlist L;
    int n;
    scanf("%d",&n);
    Createlist(&L,n);
    printf("%d",Maxsum(L.elem,0,n-1));
}

四、在线处理

//在线处理
int maxSum(int *a,int n){
    int i,j,k,sum=0,maxSum=0;
    for(i=0;i<n;i++){
        sum += a[i];
        if(sum > maxSum) maxSum = sum;
        else if(sum < 0) sum=0;
    }
    return maxSum;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值