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;
        }
  • 相关阅读:
    你知道Synchronized底层实现原理嘛
    一篇搞定Java集合类原理
    lsp都要会的内存模型
    Sql Server 查询优化
    使用Windows的mstsc远程桌面连接到Ubuntu图形界面(AWS上安装的Ubuntu系统)
    AWS EC2实例Ubuntu系统设置root用户密码并使用root/ubuntu用户登录
    安装mysql.zip文件教程(包含常见问题修复)
    DevExpress GridControl小结
    C#开发必会
    C# 错误集锦
  • 原文地址:https://www.cnblogs.com/phenixyu/p/5399228.html
Copyright © 2011-2022 走看看