要求:
1,输入一个二维整形数组,数组里有正数也有负数。
2,二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和,
3,求所有子数组的和的最大值。
设计思路:
参照一维整数数组求解最大子数组的方法,我们想着将二维数组通过行不同,列相加的方法转化为一维整数数组再求解最大子数组之和。
具体实现:先求出每一行的最大子数组之和,之后比较得出最大和MaxSum,然后通过上述方法求二行的最大子数组之和并与MaxSum比较,用MaxSum存放较大值。以此类推,求三行,四行。。。
最后实现最大子数组的输出及其和的输出。
合作过程:
两人合作探讨设计思路;
一人负责分析程序,编写代码;
另一人负责代码复审和代码测试。
主要代码:
1 //二维整数数组最大子数组之和 2 #include <iostream> 3 #include <stdlib.h> 4 #include <time.h> 5 using namespace std; 6 7 int main() 8 { 9 int M,N; 10 cout << "输入二维数组的行数和列数:" << endl; 11 cin >> M >> N; 12 int data[M][N],line[N],sum = 0,d1 = 0; 13 int MaxSum ,Maxd1,end1[M][N] = {0},end2[M][N] = {0}; 14 int i_max = 0,j_max = 0; 15 srand((unsigned int)time(0)); //保证生成不同的随机数 16 cout << "二维数组为:" << endl; 17 for (int j = 0;j < M;j++) //给二维数组的元素赋值并输出,取值范围是-25到25 18 { 19 for (int k = 0;k < N;k++) 20 { 21 data[j][k] = rand()%50 - 25; 22 cout << data[j][k] << ' '; 23 } 24 cout << endl; 25 } 26 cout << endl; 27 28 MaxSum = data[0][0]; //初值赋值为数组第一行第一个元素 29 Maxd1 = data[0][0]; 30 for (int i = 0;i < M;i++) 31 { 32 for (int i1 = 0;i1 < M-i;i1++)//当1行是循环M次 33 { 34 for (int j = 0;j < N;j++)//赋初值 35 { 36 line[j] = 0; 37 } 38 for (int i2 = i1;i2 <= i1+i;i2++)//每次循环i次赋值 39 { 40 for (int j = 0;j < N;j++) 41 { 42 line[j] += data[i2][j]; 43 } 44 } 45 sum = 0; 46 for (int k = 0;k < N;k++) 47 { 48 sum += line[k]; 49 if (sum > MaxSum) 50 { 51 MaxSum = sum; 52 end1[i][i1] = k; 53 i_max = i; //最大的时候是i行; 54 j_max = i1; 55 } 56 if(sum < 0) 57 { 58 sum = 0; 59 } 60 } 61 62 for (int k = N-1;k >= 0;k--) 63 { 64 d1 += line[k]; 65 if (d1 > Maxd1) 66 { 67 Maxd1 = d1; 68 end2[i][i1] = k; 69 } 70 if(d1 < 0) 71 { 72 d1 = 0; 73 } 74 } 75 76 } 77 } 78 cout << "最大子数组为:" << endl; 79 for (int k = 0;k <= i_max;k++)//输出最大子数组元素 80 { 81 for (int k1 = end2[i_max][j_max];k1 <= end1[i_max][j_max];k1++) 82 { 83 cout << data[j_max+k][k1] << ' '; 84 } 85 cout << endl; 86 } 87 88 cout << endl; 89 cout << "最大子数组的和为: " << MaxSum << endl; 90 }
运行截图:
遇到的问题及解决方法:
日期 |
编号 |
类型 |
引入阶段 |
排除阶段 |
修复时间 |
修复缺陷 |
10.20 |
1 |
循环函数错误 |
设计阶段 |
编码 |
40min |
查找资料,完善设计思路 |
描述:对如何实现最大子数组的查找思路不明确,查找并借阅相关资料,完善设计思路 |
||||||
10.20 |
2 |
函数错误 |
编码 |
编译 |
30min |
反复调试,查找资料 |
描述:对函数编写不熟悉,bug太多,反复编译并查找错误 |
体会:
对如何查找二维整数数组最大子数组的和有了深刻的理解,对循环函数的使用也更加熟悉,但是,由于编程能力有限,无法解决算法时间复杂度的问题。上述编程的时间复杂度为O(n^3),不能达到时间复杂度为O(n)
的目标。
合作图片:
组内成员:张素颖,于芳娜