最大子序列和问题

//求最大子序列和的四种复杂度方法
//在学习网易公开课的数据结构课程时,写的程序
//记录下来,鼓励自己坚持学习下去 
#include <stdio.h>

//在pat测试时,部分正确,运行时间太长
//暴力求解方法 
int MaxSum1(int a[], int n)
{
    int i,j,k,temp,sum;
    sum = 0;

    for (i = 0; i < n; i++)
    {
        for (j = i; j < n; j++)
        {
            temp = 0;
            for (k = i; k <=j; k++)
            {
                temp += a[k];
                if (temp > sum)
                {
                    sum = temp;
                }
            }
        }
    }
    return sum;
}


//在方法1上的优化
int MaxSum2(int a[], int n)
{
    int i,j,temp,sum;
    sum = 0;

    for (i = 0; i < n; i++)
    {
        temp = 0;
        for (j = i; j < n; j++)
        {
            temp += a[j];
            if (temp > sum)
            {
                sum = temp;
            }
        }
    }
    return sum;
}


//分治法 
int MaxSum3(int a[], int start, int stop)
{
    int index,leftresult,rightresult,crossresult,result,temp,i,lefttemp,righttemp;
    leftresult = rightresult = crossresult = result = 0;
    //考虑终止条件,第一次写时,没有写终止条件
    if (start == stop)
    {
        if (result < a[start])
        {
            result = a[start];
        }
    }
    if (start < stop)
    {
        index = (start + stop) / 2;
        //左右最大和
        leftresult = MaxSum3(a,start,index);
        rightresult = MaxSum3(a,index+1,stop);
        temp = lefttemp = righttemp = 0;
        //开始求跨越边界最大和
        //包含边界的左边最大和
        for (i = index; i >= start; i--)
        {
            temp += a[i];
            if (temp > lefttemp)
            {
                lefttemp = temp;
            }
        }
        //包含边界的右边最大和
        temp = 0;
        for (i = index + 1; i <= stop; i++)
        {
            temp += a[i];
            if (temp > righttemp)
            {
                righttemp = temp;
            }
        }
        //可以写一个求三个数最大和的函数
        crossresult = lefttemp + righttemp;
        result = leftresult;
        if (result < rightresult)
        {
            result = rightresult;
        }
        if (result < crossresult)
        {
            result = crossresult;
        }
    }

    return result;
}
 
int MaxSum4(int a[], int n)
{
    int i,temp,sum;

    temp = sum = 0;
    for (i = 0; i < n; i++)
    {
        temp += a[i];
        if (temp > sum)
        {
            sum = temp;
        }
        else if (temp < 0)
        {
            temp = 0;
        }
    }

    return sum;
}


//测试程序 
int main()
{
    int n,i,result;
    scanf("%d",&n);
    int a[n];

    for (i = 0; i < n; i++)
    {
        scanf("%d",&a[i]);
    }
    //更改函数名,测试相应的函数 
    result = MaxSum3(a,0,n-1);
    printf("%d",result);

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值