本方法是基于一维数组来思考的,利用一维数组来描绘出二维数组,从而简化对二维数组求最大子数组的难度。即(a[i][j] = a[i*n+j],用一维数组表示二维数组)
#include<stdio.h> void MAX(int *a,int m,int n) { int max=a[0],sum=0; for(int i=0;i<m;i++) { for(int j=0;j<n;j++) { for(int i2=i;i2<m;i2++) { for(int j2=j;j2<n;j2++) { sum = 0; for(int i3=i; i3<=i2;i3++) for(int j3=j; j3<=j2;j3++) { sum+=a[i3*n+j3]; } if(max<sum) max=sum; } } } } printf("%d",max); } main() { int a[]={1,2,3, -4,-5,-6, 9,4,-1}; printf(" 1,2,3 -4,-5,-6 9,4,-1 的MAX:"); MAX(a,3,3); int b[]={1,2,3, 4,5,6, 9,4,1}; printf(" 1,2,3 4,5,6 9,4,1 的MAX:"); MAX(b,3,3); int c[]={-1,-2,-3, -4,-5,-6, -9,-4,-1}; printf(" -1,-2,-3 -4,-5,-6 -9,-4,-1 的MAX:"); MAX(c,3,3); int d[]={-1,2,-3, -4,5,-6 }; printf(" -1,2,-3 -4,5,-6 的MAX:"); MAX(d,2,3); }
对函数进行测试:
分别对 正、负、正负、n*n、n*m型二维数组进行了测试。