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

    最大连续子序列和问题用于求解如下问题:
    对于一个长度为n的数组a,a[i],a[i+1],...,a[j]为其一个子序列,a[i]到a[j]的所有数加起来为这个子序列的和,a的所有子序列和中最大的那个就是a的最大子序列和
    对于这个问题,我们可以用动态规划的思想来表示,即:
    f[0] = a[0]
    f[i] = max(f[i-1] + a[i], a[i])
    其中,f[i]表示以a[i]为最后一个元素的子序列中最大的那个子序列和。
    则问题求解的C++代码如下:

    int f[maxn];
    
    int getMax(int a[], int n)
    {
        f[0] = a[0];
        for (int i = 1; i < n; i ++)
        {
            if (f[i-1] < 0)
                f[i] = a[i];
            else 
                f[i] = f[i-1] + a[i];
        }
        int res = f[0];
        for (int i = 1; i < n; i ++)
            if (f[i] > res)
                res = f[i];
        return res;
    }
    

    鉴于数组f保存的是一个中间结果,所以如果我们不必要保存这个中间结果,则只需要用一个变量f来存放中间结果就可以了,修改后的代码如下:

    int getMax(int a[], int n)
    {
        int f = a[0], res = a[0];
        for (int i = 1; i < n; i ++)
        {
            if (f < 0)
                f = a[i];
            else 
                f += a[i];
            if (f > res)
                res = f;
        }
        return res;
    }
    

    一些应用题目:
    例1:给你一个长度为n的数组a,求其两个不连续的子序列,使得这两个子序列的书的和最大。输出最大的和。
    提示:进行两遍最大子序列和的计算,一次顺序,另一次逆序。注意:保存的中间数组的值和最大子序列可能会略有不同。
    例2:最大子矩阵。给定一个二维数组,它的最大子矩阵是其中的某一个矩阵,该矩阵中的所有的元素的和最大。
    举个例子:

    对于一个二维数组:
    1, 2, 3, 4, 5,
    6, 7, 8, 9,10,
    11,12,13,14,15,
    16,17,18,19,20
    我们可以看出他是一个4*5大小的二维数组,但是我们也可以说他是一个矩阵
    其中,
    2,3,4,
    7,8,9
    就是它的一个从第1行到第3行,第0列到第1列的一个子矩阵。
    

    提示:将二维问题降到一位,然后用最大连续子序列和进行求解。

  • 相关阅读:
    【Java】组合 继承 代理
    《Thinking In Java》笔记之十三章 字符串
    常用Dos命令
    Thinking in Java异常笔记与习题
    php去重 逗号分隔的字符串
    php 连接本地数据库
    vue重载子组件
    小程序更改checked样式
    JavaScript中两个数组的拼接
    FROM_UNIXTIME()时间戳转换函数
  • 原文地址:https://www.cnblogs.com/xianyue/p/6883396.html
Copyright © 2011-2022 走看看