您的位置:首页 > 其它

最大子数组和系列

2015-05-30 09:16 246 查看
求一个矩阵中和最大的子矩阵

思路:尝试直接二维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])
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: