最大子数组和系列

求一个矩阵中和最大的子矩阵

思路:尝试直接二维dp,发现f[i][j] 和 f[i - 1][j], f[i][j- 1], f[i- 1][j - 1]没有明显的递推关系。

solution: 枚举子矩阵的上下界,列聚合,转化成一维最大子数组问题。先对原矩阵按列求前缀和,第i行与第j行之间第k列上的和就是A[j][k] - A[i - 1][k]。

def maxMatrixSum(A):
    m, n, res = len(A), len(A[0]), 0
    for i in xrange(1, m):
        for j in xrange(n):
            A[i][j] += A[i - 1][j]
    for i in xrange(m):
        for j in xrange(i, m):
            f = 0
            for k in xrange(n):
                x = A[j][k] - (A[i - 1][k] if i > 0 else 0)
                f = max(f + x, x)
                res = max(res, f)
    return res


2 环形数组最大子数组和

分析:最优解不外两种可能,不跨越的和跨越的情况,不跨越的就是一般子数组和问题。跨越数组可以看作原数组减去中间那个正常数组,总和减去A[1 : n-1]上的最小子数组和就是所求。


3最大子数组积问题

主要是符号突变问题,同时维护最大积和最小积,

maxProduct = max(maxProduct * A[i], minProduct * A[i])

minProduct = min(maxProduct * A[i], minProduct * A[i])


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值