最大连续子序列和

最大连续子序列和问题用于求解如下问题:
对于一个长度为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列的一个子矩阵。

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

原文地址:https://www.cnblogs.com/xianyue/p/6883396.html