题目:返回一个二维整数数组中最大子数组的和
要求:1.输入一个二维整型数组,数组里有正数也有负数。
2.二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和。
3.求所有子数组的和的最大值。
设计思想: 二维数组求最大子数组可以简化成多个一维数组比较求最大 。
1.首先在用户输入行数列数以及相应二维数组后,即确定了数组列数的最大上界,从第一列开始确定最大子数组范围。
2.对于规定好的最大子数组的范围,把数组分成几组有不同的列的数组(如第一组只有一列,第二组有两列等,而行数则和原数组的行数相同)。
3.对于以上产生的几个数组,用一维数组求子数组之和最大值的方法,依次求出最大值,比较,保留最大的。
4.然后从最大上界依次减小,重复以上步骤。
源代码为:
1 #include<iostream> 2 #include<stdlib.h> 3 using namespace std; 4 5 void main () 6 { 7 int x,y,i,j,m=0; 8 cout<<"Please enter the number of rows for an array:"; 9 cin>>x; 10 cout<<"Please enter the number of columns in the array:"; 11 cin>>y; 12 int *A = new int[x*y]; 13 cout<<"Enter the array:"<<endl; 14 for(i=0;i<x;i++) 15 { 16 for(j=0;j<y;j++) 17 { 18 cin>>A[i*y+j]; //表示第i行第j列元素(注意i乘的是列数) 19 } 20 } 21 int sum[100]={0},MaxSum=A[0]; 22 //以列为基准进行循环(即先竖着加) 23 for(j=0;j<y;j++) //确定子数组的列数(用输入的y确定) 24 { 25 for(m=0;m<y;m++) //确定子数组有j(j不超过y-m)行 26 { 27 for(i=0;i<x;i++) 28 { 29 sum[i]=sum[i]+A[i*y+(m+j)]; 30 } 31 int max=0; //初始化定义一个值为零的max 32 for(i=0;i<x;i++) 33 { 34 if(max+sum[i]>sum[i]) 35 { 36 max=max+sum[i]; 37 } 38 else 39 { 40 max=sum[i]; 41 } 42 if(max>MaxSum) 43 { 44 MaxSum=max; 45 } 46 } 47 } 48 //初始化sum[i]的值,使子数组最大上界下降1,之后重新循环。 49 for(i=0;i<x;i++) 50 { 51 sum[i]=0; 52 } 53 } 54 cout<<"The sum of the largest subarray is:"<<MaxSum<<endl; 55 system("pause"); 56 }
结果截图:
总结与体会:1.最开始,为了确保求和的数组的确是矩阵,我们尝试了用一步一步的循环分别将一行矩阵,二行矩阵,三行矩阵分类相加,类内比较,再类间比较取最大的方法,但是前提是我们输入的原二维数组是3行3列的,这种情况下代码就已经很多了,而一旦数组再有任何变化就要修改整个程序,这种方法的复杂与笨拙就显示出来了。之后,我们在经过观察和总结网上的例子作参考以后,写出了以上源代码,目前为止我们都觉得这样的代码既能满足要求又比较容易理解。
2.学习了如何用new定义二维数组:
以m*n举例:
第一种方法:
int **a = new int*[m];
for(int i=0; i < m; i++)
a[i] = new int[n];
第二种方法:
int* a = new int[m*n];
a[i*n+j]是第i行第j列元素
3.双人结对编程的确可以提高效率,看来以后不仅需要提高自己的能力,更需要多多增强团队合作意识与能力。
合作美图:
( 20163953 关甜欢 20163955 王美仪 )