求二维数组最大子数组的和
结对开发成员:朱少辉,侯涛亮
朱少辉:负责程序分析,代码编程
侯涛亮:负责代码复审和代码测试
设计思路:
根据求一维子数组的最大子数组和的列子,把二维数组分解成若干个一维子数组,如m行n列的数组可分为(m+1)*m/2个子数组,在求每个一维数组的最大子数组和,把这些和放入一个数组中,求这个数组的最大值就是二维数组最大子数组的和。这种算法的时间复杂度为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(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; }
:
总结:
这次编程我主要负责程序分析,代码编程,这对我的编程能力有很大的提高。一维数组和二维数组求最大子数组的和的思路是差不多的,可见程序是可以分类的。通过合作我们完成的编程和测试,感到了合作和分工的重要性,还学会了当出现分歧时怎么去交流,去说服对方,收获很大。