编程之美:第二章 数字之魅 2.15子数组之和的最大值(二维)
2015-08-03 00:58
295 查看
/* 子数组之和的最大值(二维): 假设已经确定上下边界,比如知道矩形区域的上下边界分别是第a行和第c行,现在要确定左边界。 把每一列中第a行和第c行之间的元素看成一个整体,即求数组(BC[a],...,BC[M])中最大的一段,其中BC[i] = B[a][i] + ... + B[c][i],枚举矩形上下边界, 然后利用一维情况确定左右边界,可以得到二维问题的解。时间复杂度为O(n^2*m) 输入: 2 3(行和列) 1 -2 3 -4 5 6 输出: 12 */ /* 关键: 1 假设已经确定上下边界,比如知道矩形区域的上下边界分别是第a行和第c行,现在要确定左边界。 把每一列中第a行和第c行之间的元素看成一个整体,即求数组(BC[a],...,BC[M])中最大的一段,其中BC[i] = B[a][i] + ... + B[c][i],枚举矩形上下边界, 然后利用一维情况确定左右边界,可以得到二维问题的解。时间复杂度为O(n^2*m) 2 for(int a = 1 ; a <= row ; a++) { for(int c = a ; c <= row ; c++) { int iStart = BC(a,c,col,pArr);//枚举上下边界,将一列看成一个数字的结果 int iSum = BC(a,c,col,pArr);//记录多个由一列看成的数字中的最大值 3 for(int i = col-1 ; i >= 1 ; i--) { if(iStart < 0) { iStart = BC(a,c,i,pArr); } else { iStart += BC(a,c,i,pArr); } if(iStart > iSum) { iSum = iStart; } if(iSum > max) { max = iSum;//所有枚举中的最大值 */ #include <stdio.h> const int MAXSIZE = 100; const int INF = 0x7fffffff; int BC(int low,int high,int col,int pArr[][MAXSIZE])//二维数组作为参数,第二维必需写出 { int iSum = 0; for(int i = low ; i <= high ; i++) { iSum += pArr[i][col]; } return iSum; } int maxSum(int pArr[MAXSIZE][MAXSIZE],int row,int col) { int max = -INF; for(int a = 1 ; a <= row ; a++) { for(int c = a ; c <= row ; c++) { int iStart = BC(a,c,col,pArr);//枚举上下边界,将一列看成一个数字的结果 int iSum = BC(a,c,col,pArr);//记录多个由一列看成的数字中的最大值 for(int i = col-1 ; i >= 1 ; i--) { if(iStart < 0) { iStart = BC(a,c,i,pArr); } else { iStart += BC(a,c,i,pArr); } if(iStart > iSum) { iSum = iStart; } if(iSum > max) { max = iSum;//所有枚举中的最大值 } } } } return max; } void process() { int n,m; while(EOF != scanf("%d %d",&n,&m)) { int iArr[MAXSIZE][MAXSIZE]; for(int i = 1 ; i <= n ; i++) { for(int j = 1 ; j <= m ;j++) { scanf("%d",&iArr[i][j]); } } printf("%d\n",maxSum(iArr,n,m)); } } int main(int argc,char* argv[]) { process(); getchar(); return 0; }
相关文章推荐
- 编程之美:第二章 数字之魅 2.19区间重合判断
- 编程之美:第二章 数字之魅 2.17数组循环移位
- 编程之美:第二章 数字之魅 2.20程序理解和时间分析
- 编程之美:第三章 结构之法 3.9重建二叉树
- Java_链表实现
- 编程之美:第三章 结构之法 3.10分层遍历二叉树
- 编程之美: 第三章 结构之法 3.2电话号码对应英语单词
- 编程之美:第三章 结构之法 3.8求二叉树中结点的最大距离
- 编程之美:第三章 结构之法 3.3计算字符串的相似度
- 编程之美:第三章 结构之法 3.4从无头单链表中删除节点
- 编程之美:第三章 结构之法 3.7队列中取最大值操作问题
- Python操作Excel实践总结
- google 笔试题: 丑数
- 编程之美:第三章 结构之法 3.6编程判断两个链表是否交叉
- java入门
- LeetCode 210. Course Schedule II(拓扑排序-求有向图中是否存在环)
- 在 ASP.NET MVC 应用中使用 NInject 注入 ASMX 类型的 Web Service
- php正则表达式,在抓取内容进行匹配的时候表现不稳定
- [Java] 利用Java反射机制取代switch catch判断
- java_ EngorgeSnake