设计思路:将二维数组转化为一维数组求和,将二维数组的第一行(列)赋值为新的一维数组,
同样,赋值第二行(列)为另一个一位数组。分别求和比较最大值。
1 //返回一个二维数组的最大子数组 2 3 #include<iostream> 4 #include<ctime> 5 using namespace std; 6 7 int main() 8 { 9 int m, n; //数组大小 10 int i, j, p, q, o; //循环变量 11 int a[100][100]; //数组 12 int sh, x; //数值范围 13 14 int sum, sum1 = -100, sum2 = -100; //计算和 15 int max = a[0][0]; //最大值 16 int s[100]; //转化成的一位数组 17 int k = 0; //控制行数的变量 18 19 cout << "请输入矩阵的行列数(上限100):"; 20 cin >> m >> n; 21 cout << "请输入数值范围(a-b):" << endl; 22 cin >> sh >> x; 23 24 cout << "原矩阵为:" << endl; 25 srand((unsigned)time(NULL)); 26 for (i = 0; i<m; i++) 27 { 28 for (j = 0; j<n; j++) 29 { 30 a[i][j] = rand() % (x - sh + 1) + sh; 31 cout << a[i][j] << " "; 32 } 33 cout << endl; 34 } 35 36 for (j = 0; j<n; j++) 37 { 38 s[j] = 0; 39 } 40 for (i = 0; i<m; i++) 41 { 42 while (k + i<m) 43 { 44 for (j = 0; j<n; j++) 45 { 46 s[j] = s[j] + a[k + i][j]; 47 } 48 49 for (p = 0; p < n; p++) 50 { 51 for (q = 0; q <= p; q++) 52 { 53 sum = s[0]; 54 for (o = q+1; o <= p; o++) 55 sum = sum + s[o]; 56 57 if (sum > sum1) 58 { 59 sum1 = sum; 60 } 61 } 62 if (sum1 > sum2) 63 { 64 sum2 = sum1; 65 } 66 } 67 if (sum2 > max) 68 { 69 max = sum2; 70 } 71 72 k++; 73 } 74 k = 0; 75 for (j = 0; j<n; j++) 76 { 77 s[j] = 0; 78 } 79 } 80 81 cout << "和最大子矩阵值为" << max << endl; 82 83 return 0; 84 }
实验截图:
总结:经过一小段时间的学习,将数组部分的一些简单问题搞明白了,并且从最基础的c++语句出发,看了看生疏的大一知识。感觉不学一定会倒退!