题目:返回一个二维整数数组中最大子数组的和
- 要求:(1)输入一个二维整形数组,数组里有正数也有负数。
(2)二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和。
(3)求所有子数组的和最大值。
- 结对编程要求:(1)两人结对完成编程任务。
(2)一人主要负责程序分析,代码编程。
(3)一人负责代码复审和代码测试计划。
(4)发表一篇博客文章讲述两人合作中的过程、体会以及如何解决冲突(附结对开发的工作照)
组员:20163946-谭松(分析)、20163976-韩文亮(编程)
程序分析:(1)先输入一个二维整数数组。
(2)定义一个一维数组用来存放子矩阵的和。
(3)求各个子矩阵的和,从左上角开始,确定一个起始点,再确定一个终止点,由此确定一个矩阵,计算此矩阵的和。从左上角到右下角,确定起始点终止点可以找出所有子矩阵。
(4)将所有矩阵的和依次输出,每十个换行。
(5)从存放子矩阵和的一维数组中比较大小找出最大的和,再输出。
程序代码:
1 #include<iostream> 2 #include <stdlib.h> 3 using namespace std; 4 #define N 100//定义数组最大范围 5 int main() 6 { 7 int n,m,a,b,c,d,i,j,k=0; //n是行,m是列,a,b,c,d,i,j都是循环变量,k是sum[]的参数 8 cout<<"please input the row and column of the array:";//输入二维数组的行和列 9 cin>>n>>m; 10 if(n>N||m>N)//判断行和列是否超出范围 11 { 12 cout<<"please input again:"; 13 cin>>n>>m; 14 } 15 int **A=new int*[n];//定义二维数组指针 16 for(i=0;i<n;i++) 17 { 18 A[i]=new int[m]; 19 } 20 cout<<"please input array:"<<endl;//输入数组 21 for(i=0;i<n;i++) 22 { 23 for(j=0;j<m;j++) 24 { 25 cin>>A[i][j]; 26 } 27 } 28 int sum[1000],max;//sum[1000]用来储存子数组的和,max为最大值 29 sum[0]=0; 30 max=A[0][0]; 31 for(a=0;a<n;a++) 32 { 33 for(b=0;b<m;b++) 34 { 35 for(c=a;c<n;c++) 36 { 37 for(d=b;d<m;d++) 38 { 39 for(i=a;i<=c;i++) 40 { 41 for(j=b;j<=d;j++) 42 { 43 sum[k]=sum[k]+A[i][j]; 44 } 45 } 46 47 k++; 48 sum[k]=0; 49 } 50 } 51 } 52 } 53 cout<<"the sum of the submatrices:"<<endl; 54 for(i=0;i<k;i++) 55 { 56 cout<<sum[i]<<" ";//输出各个子数组和 57 if((i+1)%10==0)//每十个换行 58 { 59 cout<<endl; 60 } 61 if(sum[i]>max)//求最大值 62 { 63 max=sum[i]; 64 } 65 } 66 cout<<endl<<"the sum of the largest subarray of the array is"<<max<<endl;//输出最大值 67 return 0; 68 }
测试截图:
实验总结:两个人共同合作,一起解决遇到的问题,对于那个循环我们是共同经过实际验算,实际验证,用了两个多小时,编出循环体。难的部分也是循环体部分,预计五个小时,实际七个小时。