//注:本次小队成员为:王友军,白宇乾,黄瑞玻;原因与上一次相同,请见谅。
本次作业是关于二维整型数组的最大子数组的求解,相比第一次的一维数组来说,确实难了些。经过我们的苦思冥想,想了很多设计思路,但是都是存在着很多问题;在没有别的好的方法选择之后,我们只能选择了最基本的:枚举法进行求解。设计思路:
1.确定二维数组的所有子数组的数量,并用一个一维整型数组sum[]存储;
2.从第一个元素开始,以第一个元素为子数组的起始元素,将整个数组遍历,每得到一个二维子数组,就存储到sum[]中;然后以第二个元素为开始;依此类推,直到最后一个元素结束。
3.然后求出sum[]数组中的最大元素,则该元素就是最大的子数组和。
程序代码:
1 #include<iostream> 2 using namespace std; 3 4 int main() 5 { 6 int m,n; 7 cout << "请输入二维数组的行和列:"; 8 cin >> n>> m; 9 //定义一个可变长二维数组; 10 int** a; 11 a = new int*[n]; 12 for (int i = 0; i <= n; i++) 13 { 14 a[i] = new int[m]; 15 } 16 //定义一个存储二维数组所有子数组的可变长一维数组; 17 int *sum=new int [m*(m+1)*n*(n+1)/4]; 18 for (int i = 0; i < m*(m + 1)*n*(n + 1) / 4; i++) 19 { 20 sum[i] = 0; 21 } 22 int t = 0; 23 cout << "输入数组的值:" << endl; 24 for (int i = 0; i < n; i++) 25 { 26 for (int j = 0; j < m; j++) 27 { 28 cin >> a[i][j]; 29 } 30 } 31 //用枚举法将所有子数组的和求出,放到sum数组里; 32 for (int i = 0; i < n; i++) 33 { 34 for (int j = 0; j < m; j++) 35 { 36 for (int p = i; p < n; p++) 37 { 38 for (int q = j; q < m; q++) 39 { 40 for (int y = i; y <= p; y++) 41 { 42 for (int x = j; x <= q; x++) 43 { 44 //求子数组和; 45 sum[t] = sum[t] + a[y][x]; 46 } 47 } 48 t++; 49 } 50 } 51 } 52 } 53 //求最大子数组; 54 for (int i = 0; i < m*(m + 1)*n*(n + 1) / 4; i++) 55 { 56 if (sum[0] < sum[i]) 57 { 58 sum[0] = sum[i]; 59 } 60 } 61 cout<< "最大子数组的和为:"<<sum[0] << endl; 62 system("pause"); 63 return 0; 64 }
测试截图:
小组成员: