一 题目:求二维数组中最大子数组的和
结对开发人员:
朱少辉:负责程序分析,代码编程
侯涛亮:负责代码复审和代码测试
二 设计思路
我认为若想求二维数组中最大子数组,可以将二维数组化为一维数组,在对其求连续子数组最大值。那么如何将一个二维数组化为一维数组呢?可以举一个例子,如下:
i=0 5 6 -3 8 -9 2
i=1 1 -12 20 0 -3 -5
i=2 -9 -7 -3 6 7 -1
例子为一个3*6矩阵,令其为a[3][6]。由于可以行行相加或列列相加转化为一维数组,在这为行行相加,故附设一个一维数组是s[6],初值均为0。附设两变量SUM和MAX,max初始值为a[0][0]即5。当i=0时,将a[0][0]-a[0][5]的值赋给s[6],用求一维最大子数组的方法求得最大值赋给MAX,然后,再将i=1行的元素加到第一行(即s[j]=s[j]+a[1][j])再赋值给s[6],求最大子数组,然后接着将第三行元素往上加(即s[j]=s[j]+a[2][j]),最后求得含第一行元素的子矩阵的最大值。把s[6]回归为0。同理,从第二行开始,依次往下加,从第三行开始....最后可求得最大子矩阵的值。这种算法的时间复杂度为O(n^3).
三 代码实现
#include<iostream> using namespace std; void main() { int m,n,i,j,a[100][100]; cout<<"请输入矩阵的大小(m*n):"; cin>>m>>n; cout<<"请输入矩阵:"<<endl; for(i=0;i<m;i++) { for(j=0;j<n;j++) { cin>>a[i][j]; } } int sum,max=a[0][0],s[100],k=0; for(j=0;j<n;j++) { s[j]=0; } for(i=0;i<m;i++) { while(k+i<m) { for(j=0;j<n;j++) { s[j]=s[j]+a[k+i][j]; } sum=0; for(j=0;j<n;j++) { if(s[j]+sum>s[j]) { sum=s[j]+sum; } else { sum=s[j]; } if(sum>max) { max=sum; } } k++; } k=0; for(j=0;j<n;j++) { s[j]=0; } } cout<<"子矩阵最大值为"<<max<<endl; }
四 截图
五 总结
在结对开发过程中,我们一致认为需要将二维数组化为一维数组,再用一维数组的动态规划思想求解问题。然而这种算法的时间复杂度只能为O(n^3)。最后再怎么想,也很难降低时间复杂度。在代码测试阶段,需要考虑到多种情况,例如都为负数,或一行正一行负亦或者一列正一列负,还有数组越界等等情况都需考虑周到。在结对开发过程中,我们相互协作,尽力而为,高效率地完成了工作。
六 工作照