编程之美2.15 子数组之和的最大值(二维)
来源:互联网 发布:防范网络诈骗心得800 编辑:程序博客网 时间:2024/05/22 06:17
题目:求二维数组(矩阵)的子矩阵之和的最大值。
把问题从二维转化为一维。假设已经确定了矩阵区域的上下边界,不如知道矩阵区域的上下边界分布是第a行和第c行,接下来要确定左右边界。
我们把第a行和第c行之间的每一列看成一个整体,相当于一维数组中的一个元素。即求BC[1]、BC[2]、BC[3]、.。。、BC[M]中和最大的一段。
BC[i]= B[a][i] + .......+ B[c][i]。
枚举矩形的上下边界,再用一维情况下的方法确定左右边界。就可以得到二维问题的解。时间复杂度:O(N^2 * M)
Example:
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
最大子矩阵为:
9 2
-4 1
-1 8
输出:15
二维情况下,定义部分和:PS[i][j] 等于以(1,1)、(i,1)、(1,j)、(i,j)为顶点的矩形区域的元素之和。
在O(1)的时间可以得到更小的部分和:PS[i][j] = PS[i][j-1] + PS[i-1][j] - PS[i-1][j-1] + A[i][j]
程序如下:
#include<iostream>using namespace std;#define max(a,b) (((a)>=(b))?(a):(b))int BC(int **PS,int a,int c,int i){return PS[c][i]-PS[c][i-1]-PS[a-1][i]+PS[a-1][i-1];}int main(){int Start,All;int m,n;int i,j;int **PS;int **A;int a,c;int maxnum=-1;cout<<"请输入行数:";cin>>n;cout<<"请输入列数:";cin>>m;PS=(int **)malloc(sizeof(int*)*(n+1));A=(int **)malloc(sizeof(int*)*(n+1));for (i=0;i<=n;i++){PS[i]=(int *)malloc(sizeof(int)*(m+1));A[i]=(int *)malloc(sizeof(int)*(m+1));}cout<<"请输入"<<n<<"行"<<m<<"列数字:"<<endl;for (i=1;i<=n;i++){for (j=1;j<=m;j++){cin>>A[i][j];}}//求部分和for (i=0;i<=n;i++){PS[i][0]=0;}for (j=0;j<=m;j++){PS[0][j]=0;}for (i=1;i<=n;i++){for (j=1;j<=m;j++){PS[i][j]=A[i][j]+PS[i][j-1]+PS[i-1][j]-PS[i-1][j-1];}}//枚举求出问题的解for (a=1;a<=n;a++){for (c=a;c<=n;c++){Start=BC(PS,a,c,m);All=BC(PS,a,c,m);for (i=m-1;i>=1;i--){Start=max(BC(PS,a,c,i),BC(PS,a,c,i)+Start);All=max(Start,All);if (All>maxnum){maxnum=All;}}}}cout<<maxnum<<endl;return 0;}
- 编程之美---子数组之和的最大值(二维)
- 编程之美 子数组之和的最大值(二维)
- 读书笔记之编程之美 - 2.15 子数组之和的最大值(二维)
- 编程之美2.15 子数组之和的最大值(二维)
- 编程之美读书笔记2.15 - 子数组之和的最大值(二维)
- 编程之美2.15子数组之和的最大值(二维)
- 编程之美-2.15 子数组之和的最大值(二维)
- 编程之美:第二章 数字之魅 2.15子数组之和的最大值(二维)
- 编程之美2.15——二维子数组之和的最大值
- 编程之美2.15——二维子数组之和的最大值
- 编程之美2.15子数组之和的最大值(二维)Java版
- 编程之美——子数组之和的最大值(二维)
- [编程之美] PSet2.15 子数组之和的最大值(二维)
- 编程之美-子数组之和的最大值(二维)方法整理
- 编程之美--求子数组之和的最大值
- 编程之美2.14求子数组之和的最大值
- 编程之美子数组之和的最大值
- [编程之美2.14]求子数组之和的最大值
- 1068 公园门票
- iniparser
- windows.h头文件
- wxpython 中wxOGL的使用 第三篇
- telnet常见问题
- 编程之美2.15 子数组之和的最大值(二维)
- 错误整理:RsyncServer服务无法正常启动的解决办法
- 成大事必备9种能力、9种手段、9种心态
- perl 连接sql server数据库
- C++学习书籍推荐
- 图像形态学 - 自适应阈值(cvAdaptiveThreshold)
- Unity3d---> IEnumerator
- 你需要的不是重构,而是理清业务逻辑
- 混迹在腾讯微博的知名站长名单