Maximum Subsequence Sum

//四种求最大和的方法中,只有第二种和第四种写了输出首尾的程序
//第三种分治法暂时没想到怎么写
#include <stdio.h>

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;
}

void MaxSum2(int a[], int n, int result[])
{
    int i,j,temp;
    //如果除0外全是负数(考虑这种情况)
    //这种情况应该输出第一个0
    //如果result初始值为0,则会出问题
    result[0] = -1;
    result[1] = a[0];
    result[2] = a[n-1];

    for (i = 0; i < n; i++)
    {
        temp = 0;
        for (j = i; j < n; j++)
        {
            temp += a[j];
            if (temp > result[0])
            {
                result[0] = temp;
                result[1] = a[i];
                result[2] = a[j];
            }
        }
    }
    if (result[0] == -1)
    {
        result[0] = 0;
    }
}

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;
}

void MaxSum4(int a[], int n, int result[])
{
    int i,temp,minindex;
    //同样注意初始值要为-1;
    result[0] = -1;
    result[1] = a[0];
    result[2] = a[n-1];

    temp = 0;
    minindex = 0;
    for (i = 0; i < n; i++)
    {
        temp += a[i];
        if (temp > result[0])
        {
            result[0] = temp;
            result[1] = a[minindex];
            result[2] = a[i];
        }
        else if (temp < 0)
        {
            //当temp小于0时,更新开始值。
            minindex = i+1;
            temp = 0;
        }
    }
    //全为负数的情况,一定要考虑,此点第一次测试时出错了
    if (result[0] == -1)
    {
        result[0] = 0;
    }
    return ;
}

int main()
{
    //result用来存储结果,0-最大值,1-开始值,2-结束值
    int n,i,result[3];
    scanf("%d",&n);
    int a[n];

    for (i = 0; i < n; i++)
    {
        scanf("%d",&a[i]);
    }

    MaxSum4(a,n,result);
    printf("%d %d %d",result[0],result[1],result[2]);

    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值