二维最大和子数组

设计思路:将二维数组转化为一维数组求和,将二维数组的第一行(列)赋值为新的一维数组,

同样,赋值第二行(列)为另一个一位数组。分别求和比较最大值。

 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++语句出发,看了看生疏的大一知识。感觉不学一定会倒退!

posted on 2015-04-15 15:43  H_Albert  阅读(122)  评论(1编辑  收藏  举报