最大子序列和问题

问题描述:

输入一组整数,求出这组数字子序列和中最大值。也就是只要求出最大子序列的和,不必求出最大的那个序列。例如:

序列:-2 11 -4 13 -5 -2,则最大子序列和为20。

序列:-6 2 4 -7 5 3 2 -1 6 -9 10 -2,则最大子序列和为16。

 

/* seq:整数组,seqSize:整数组大小 */
int MaxSubSeqSum(int *seq, int seqSize)  
{  
    int j;    
    int maxSum;
    int tmpSum;

    if ((0 == seq) || (seqSize < 1))
    {
        /* 出错 */
        return 0;
    }

    maxSum = seq[0];
    tmpSum = seq[0];

    /* 从第一个数开始,每次计算子序列和(包括一个数
    的情况),并通过与当前最大值比较,更新当前最大值。
    此时,如果子序列和小于0,说明只能重新往后查找
    更大的子序列和 */
    for (j = 1; j < seqSize; j++)
    {  
        if (tmpSum > maxSum)
        {
            maxSum = tmpSum;
        }

        if (tmpSum < 0)
        {
            tmpSum = 0;
        }

        tmpSum += seq[j];
    }  

    /* 处理加了最后一个数的tmpSum */
    if (tmpSum > maxSum)
    {
        maxSum = tmpSum;
    }

    return maxSum;  
} 

 

测试用例:

-2, 11, -4, 13, -5, -2

-2, -11, -4, -13, -5, -2

-2, -11, 4, 13, -5, -2
0, -11, 4, 13, -5, -2

-6, 2, 4, -7, 5, 3, 2, -1, 6, -9, 10, -2

5, -11, 8, 3, -5, -2

5, -8, -3, 8, -3, -5, -2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值