软件工程结对开发
开发者:节振华,尚矫健
开发流程:
经过上次求一维数组的最大子数组,用优异的算法采用一次遍历就得出来,时间复杂度为O(n)。既然二维数组是有一维数组扩展出来的,那么算法也应该能扩展出来。
一维数组从左到右不返回遍历就能实现目的,猜想二维数组应该从对角线方向,细细考虑下,发现存在很多难题,对角线位置没法确认,并存在一些例子用此方法得不到正确答案。所以只能退而求其次,用穷举法。
#include<iostream.h> static int max; void qiongju(int juzhen[][4],int ai,int aj,int m,int n) { int linshi; for(int i=ai;i<m;i++) { for(int j=aj;j<n;j++) { linshi=0; for(int i1=ai;i1<=i;i1++) { for(int j1=aj;j1<=j;j1++) { linshi=linshi+juzhen[i1][j1]; } } // cout<<linshi<<endl; if(linshi>max) { max=linshi; } } } } void main() { int juzhen[3][4]={{1,4,-6,5},{-6,7,-9,2},{6,4,2,-4}}; for(int si=0;si<3;si++) //输出矩阵 { for(int sj=0;sj<4;sj++) { cout<<juzhen[si][sj]<<" "; } cout<<endl; } max=juzhen[0][0]; for(int i=0;i<3;i++) //对每一个值作为子矩阵第一个值分别求和 { for(int j=0;j<4;j++) { qiongju(juzhen,i,j,3,4); } } cout<<"最大子矩阵和为:"<<max<<endl; }
此算法程序应该还可以优化,在对每个子矩阵求和的时候可以借助上次求和的结果,进而简化求和。程序还未达到最优,还需努力。