zoukankan      html  css  js  c++  java
  • 最大子序列

    最大子序列

    给定一个实数序列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;
        }
  • 相关阅读:
    1.8 接口中的静态方法
    1.7 默认方法
    1.6 变量作用域
    汉字转拼音
    1.5 构造器引用
    1.4 方法引用
    循环中冲不掉外部定义的变量
    getBoundingClientRect
    Angular1.0 在Directive中调用Controller的方法
    horizontalDragMaxWidth:0;就没有水平滚动条了
  • 原文地址:https://www.cnblogs.com/phenixyu/p/5399228.html
Copyright © 2011-2022 走看看