35.求一个矩阵中最大的二维矩阵
/* 求1个矩阵中最大的二维矩阵 1。 单就这一题来说,首先方法就是遍历 */ #include<iostream> using namespace std; int a[][5]={{1,2,0,3,4}, {2,3,4,5,1}, {1,1,5,3,0}, }; int m=3; int n=5; void max_matrix(void) { int i,j,k,s; int sum=-65535; for(i=0;i<m-1;i++) { for(j=0;j<n-1;j++) { int temp=a[i][j]+a[i+1][j]+a[i][j+1]+a[i+1][j+1]; if(temp>sum) { sum=temp; k=i; s=j; } } } cout<<"矩阵是"<<endl; cout<<a[k][s]<<" "<<a[k][s+1]<<endl; cout<<a[k+1][s]<<" "<<a[k+1][s+1]<<endl; } int main(void) { max_matrix(); return 0; }
/* 还有1种情况,给定1个m*n的矩阵,让你求这个最大的子矩阵的和是多少,不再是2维矩阵了 假设矩阵是 a11 a12 a13 .... a1n a21 a22 a23 .... a2n . . . am1 am2 am3 .... amn 其中有 ari ari+1 ari+2 ... arj ar+1i ... . . aki aki+1 ......... akj 是和最大的子矩阵,即有(ari + ar+1i + ar+2i +...+ aki)+(ari+1 + ar+1i+1 + ... + aki+1)+(...)和是最大的,我们把每一列的和都看成1个数 用a[i],a[i+1],,,,a[j]来表示,那么就是a[i]+a[i+1]+...+a[j]是最大的,就变成求这个数组中连续的值的最大和问题,因为在a[1],a[2],,,a[i]..a[j]...a[n]中a[i]+..+a[j]是最大的 做法就是,第r行到第k行,我们把每一列相加,看成是1个数组,然后求这个数组的连续和最大值,那么求出的就是第r到k行的,第i到第j列就是这个小矩阵的最大自矩阵和了 */ #include<iostream> using namespace std; int a[][5]={{1,2,0,3,4}, {2,3,4,5,1}, {1,1,5,3,0}, }; int m=3; int n=5; int max_array(int* array) { int i,j; int* c=new int[n]; c[0]=array[0]; for(i=1;i<n;i++) { if(c[i-1]<0) c[i]=array[i]; else c[i]=c[i-1]+array[i]; } int max_sum=-65535; for(i=0;i<n;i++) if(c[i]>max_sum) max_sum=c[i]; delete []c; return max_sum; } int max_matrix() { //求第i行到第j行的 int i,j,k,s; int max_sum=-65535; int *b=new int[n]; for(i=0;i<m;i++) { for(s=0;s<n;s++) b[s]=0; for(j=i;j<m;j++) { for(k=0;k<n;k++) b[k]+=a[j][k]; int sum=max_array(b); if(sum>max_sum) max_sum=sum; } } delete []b; return max_sum; } int main(void) { cout<<max_matrix()<<endl; return 0; }