【算法】最大子段和问题

        终于要开始学习算法了,想想都有点激动,理论的东西稍后再说,先来个例子看看

一、问题描述

        给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整均为负数时定义子段和为0,依此定义,所求的最优值为: Max{0,a[i]+a[i+1]+…+a[j]},1<=i<=j<=n。

        输入:

                一个数组,由n个整数组成

        输出:

                这个数组的最大子段和

二、例子分析

        一个数组{3,-5,6,2},它的最大子段和为8。

分析:

        首先咱们只是单纯的分析下这个问题,数组中有4个元素,这个数组所有的子段和如下


        从图中可以看出,要想求出最大子段和,只要按照数组中元素的先后顺序,把所有相邻元素的相加情况列出来,通过比较相加的结果就可以得到最大子段和。思路如下:

第一步:计算所有关于第1个元素的加法

第二步:计算所有关于第2个元素的加法(排除第一步中用到的加法)

第三步:计算所有关于第3个元素的加法(排除第一、二步中用到的加法)

……

第五步:比较以上步骤中所有加法的结果大小,最大者即为所求

三、程序

        当数组中元素增多时,显然用手动的方式来计算就太费劲了,所以把上边解题的思路编成程序,让计算机来帮我们进行运算。

/// <summary>
/// 最大子段和问题:求最大值
/// </summary>
/// <param name="a">一个长度为n的二维数组</param>
/// <param name="n">二维数组的长度</param>
/// <returns></returns>

int Max(int[] a, int n)
{
    int max = 0;
    int temp = 0;

    //循环数组中所有的元素
    for (int i = 0; i < n; i++)
    {
        //包含第j个元素的所有相加情况,并去掉已经加过的情况
        for (int j = i; j < n; j++)
        {
            temp += temp + a[j];//把相加的结果,放到一个变量中

            //比较相加的结果是否比已有的最大值大
            if (max < temp)
            {
                max = temp; //替换最大值
            }
        }
    }

    return max; //返回最大值
}
      这个是求最大子段和的最基础思路,很简单,就是嵌套了两个for循环、一个if语句不太好。它还有很多种优化思路,亲们自行解决吧

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值