求二维整型数组的所有子数组的和的最大子数组

 //注:本次小队成员为:王友军,白宇乾,黄瑞玻;原因与上一次相同,请见谅。

本次作业是关于二维整型数组的最大子数组的求解,相比第一次的一维数组来说,确实难了些。经过我们的苦思冥想,想了很多设计思路,但是都是存在着很多问题;在没有别的好的方法选择之后,我们只能选择了最基本的:枚举法进行求解。设计思路:

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 }

测试截图:

小组成员:

猜你喜欢

转载自www.cnblogs.com/Kirito-math/p/9826018.html
今日推荐