一.题目
返回一个整数数组中最大子矩阵的和。 二.要求 输入一个整形矩阵,矩阵里有正数也有负数。 矩阵中连续的一个或多个整数组成一个子矩阵,每个子矩阵都有一个和。 求所有子矩阵的和的最大值。要求时间复杂度为O(n)。 结对编程要求: 两人结对完成编程任务。 一人主要负责程序分析,代码编程。 一人负责代码复审和代码测试计划。
三.设计思路:
经过和我的搭档的研究,我们最后决定以某一个数字为中心,并扩散开来分别成立1*1,1*2,1*3,2*1.2*2,2*3,3*3的子矩阵,让后通过循环嵌套结构,每次统计子矩阵的和,最后通过比较获得最大的和,最后输出。
四:代码
1 #include <iostream> 2 3 #include <vector> 4 5 using namespace std; 6 7 8 9 const int N = 101; 10 11 int a[N][N], p[N][N]; 12 13 14 15 int MaxRecSum(int n) 16 17 { 18 19 for (int i = 0; i <= n; ++i) 20 21 { 22 23 p[i][0] = 0; 24 25 p[0][i] = 0; 26 27 } 28 29 for ( i = 1; i <= n; ++i) 30 31 { 32 33 for (int j = 1; j <= n; ++j) 34 35 p[i][j] = p[i-1][j] + p[i][j-1] - p[i-1][j-1] + a[i][j]; 36 37 } 38 39 40 41 int max = INT_MIN; 42 43 for ( i = 1; i <= n; ++i) 44 45 { 46 47 for (int j = i; j <= n; ++j) 48 49 { 50 51 int sum = 0; 52 53 for (int k = 1; k <= n; ++k) 54 55 { 56 57 int temp = p[j][k] - p[j][k-1] - p[i-1][k] + p[i-1][k-1]; 58 59 if (sum > 0) 60 61 sum += temp; 62 63 else 64 65 sum = temp; 66 67 if (sum > max) 68 69 max = sum; 70 71 } 72 73 } 74 75 } 76 77 return max; 78 79 } 80 81 82 83 int main() 84 85 { 86 87 int n = 3; 88 89 int num; 90 91 cout<<"矩阵的规格为三行三列,请输入数值:"<<endl; 92 93 for (int i = 1; i <= n; ++i) 94 95 { 96 97 for (int j = 1; j <= n; ++j) 98 99 { 100 101 cin >> num; 102 103 a[i][j] = num; 104 105 } 106 107 } 108 109 110 111 112 113 cout <<"最大字矩阵的和为:"<< MaxRecSum(n) << endl; 114 115 116 117 for ( i = 1; i <= n; ++i) 118 119 { 120 121 for (int j = 1; j <= n; ++j) 122 123 { 124 125 cout <<a[i][j]<<" "; 126 127 } 128 129 cout<<endl; 130 131 } 132 133 return 0; 134 135 }
五、截图
六、心得体会
这次的程序让我们俩很头疼,一开始都各自有一点思路,但总是被对方给的质疑搞乱,每次的循环不都能统计出全部的子矩阵的和,很多种情况都考虑不到,最后我们俩确定了一个思路之后就深挖他的循环,从内到外,讨论了很长时间。最后才完成了这个小程序。团队的力量确实很大,不过在其中也确实存在分歧,两个人各自都有各自的主见,又能给对方提问住,我觉得两个人也在这里面共同进步了。
七、合照