哨兵

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

最大子序列

给定一个实数序列x1,x2,x3.......xn,寻找一个连续的子序列xi......xj使其数组之和在所有连续子序列数值之和中时最大的,这个子序列称为最大子序列。 集合中数都是负数,则最大子序列为空,空的子序列之和为0

归纳假设:已知规模小于n的的序列的最大子序列.
    问题变为T={x1,x2,......x(n-1)}中找到了最大子序列P={xi....xj},求S={x1,x2,x3.......x(n-1),x(n)}(n>1)的最大子序列。

  • 如果T中都是负数,则S的最大子序列 在x(n)>0时为x(n),否则为0
  • 如果j=n-1,则若x(n)>0,则S的最大子序列为{P,x(n)},否则为P
  • 如果1<=j<=n-1,则有两种可能,或者P,或者存在另一个子序列包含x(n)是最大子序列

在上一步由于只知道T的最大子序列P是不够的,x(n)只能扩展一个以n-1结束的子序列——即T的后缀序列. 设想我们把归纳假设增强到包括最大后缀的信息,L={x(k)......x(n-1)},那么S的最大子序列便可求

增强归纳假设: 已知规模小于n的序列的最大子序列,以及作为后缀的最大子序列,知道最大后缀子序列后则S的最大子序列可求。

根据推导过程写出算法

private static int Maxseq(int []arr)
        {
            int suffixMax = 0;
            int globalMax = 0;
            for (int i = 0; i < arr.Length; i++)

            {
                if (suffixMax + arr[i] > globalMax)
                {                
                    suffixMax = suffixMax + arr[i];
                    globalMax = suffixMax;
                }
                else if (suffixMax + arr[i] < 0)
                {
                    suffixMax = 0;
                }
                else
                {
                    suffixMax = suffixMax + arr[i];
                }
            }
            return globalMax;
        }

 然后对算法进行精简:

private static int Maxseq(int []arr)
        {
            int suffixMax = 0;
            int globalMax = 0;
            for (int i = 0; i < arr.Length; i++)
            {
                if (suffixMax + arr[i] > 0)
                {                
                    suffixMax = suffixMax + arr[i];
                }
                else
                {
                    suffixMax = 0;
                }
                if (globalMax < suffixMax)
                {
                    globalMax = suffixMax;
                }
            }
            return globalMax;
    }
posted on 2016-04-16 20:13  哨兵  阅读(607)  评论(0编辑  收藏  举报