最大子数组和系列
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]。
2 环形数组最大子数组和
分析:最优解不外两种可能,不跨越的和跨越的情况,不跨越的就是一般子数组和问题。跨越数组可以看作原数组减去中间那个正常数组,总和减去A[1 : n-1]上的最小子数组和就是所求。
3最大子数组积问题
主要是符号突变问题,同时维护最大积和最小积,
maxProduct = max(maxProduct * A[i], minProduct * A[i])
minProduct = min(maxProduct * A[i], minProduct * A[i])
思路:尝试直接二维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])
相关文章推荐
- Leetcode_217_Contains Duplicate
- Lettcode_217_Contains Duplicate
- C++中 引用&与取地址&的区别
- 初学Ext Js 5之二-------用sencha cmd生成项目
- SQL server 时间转换
- HDU 5242 上海大都会 G题
- OpenCV学习笔记02--利用滚动条控制视频;高斯滤波处理图像。
- 分布式文件系统简介
- 使用xcrun打包iOS应用
- js获取鼠标点击事件的相对位置
- 今日尼采一语
- 记录一下:Hibernate配置文件中数据库字段的对应类型
- 菜鸟好文推荐(五)——理解 HTTPS 协议
- Hibernate详细教程
- ubuntu下更改firefox的版本
- solve 3*3 magic square problem using recursive backtracking(using Stanford CS106b ADT library)
- 乔布斯给年轻人的62个忠告
- @UIColor colorWithPatternImage方法
- iOS图片拉伸技巧
- 箱底之言