返回一个二维整数数组中最大子数组的和(二人结对)

题目:返回一个二维整数数组中最大子数组的和

要求:1.输入一个二维整型数组,数组里有正数也有负数。

2.二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和。

3.求所有子数组的和的最大值。

设计思想: 二维数组求最大子数组可以简化成多个一维数组比较求最大 。

1.首先在用户输入行数列数以及相应二维数组后,即确定了数组列数的最大上界,从第一列开始确定最大子数组范围。

2.对于规定好的最大子数组的范围,把数组分成几组有不同的列的数组(如第一组只有一列,第二组有两列等,而行数则和原数组的行数相同)。

3.对于以上产生的几个数组,用一维数组求子数组之和最大值的方法,依次求出最大值,比较,保留最大的。

4.然后从最大上界依次减小,重复以上步骤。

源代码为:

 1 #include<iostream>
 2 #include<stdlib.h>
 3 using namespace std;
 4 
 5 void main ()
 6 {
 7     int x,y,i,j,m=0;
 8     cout<<"Please enter the number of rows for an array:";
 9     cin>>x;
10     cout<<"Please enter the number of columns in the array:";
11     cin>>y;
12     int *A = new int[x*y];
13     cout<<"Enter the array:"<<endl;
14     for(i=0;i<x;i++)
15     {
16         for(j=0;j<y;j++)
17         {
18             cin>>A[i*y+j];   //表示第i行第j列元素(注意i乘的是列数)
19         }
20     }
21     int sum[100]={0},MaxSum=A[0];
22     //以列为基准进行循环(即先竖着加)
23     for(j=0;j<y;j++)       //确定子数组的列数(用输入的y确定)
24     {
25         for(m=0;m<y;m++)       //确定子数组有j(j不超过y-m)行
26         {
27             for(i=0;i<x;i++)
28             {
29                 sum[i]=sum[i]+A[i*y+(m+j)];
30             }
31             int max=0;   //初始化定义一个值为零的max
32             for(i=0;i<x;i++)
33             {
34                 if(max+sum[i]>sum[i])
35                 {
36                     max=max+sum[i];
37                 }
38                 else
39                 {
40                     max=sum[i];
41                 }
42                 if(max>MaxSum)
43                 {
44                    MaxSum=max;
45                 }
46             }
47         }
48         //初始化sum[i]的值,使子数组最大上界下降1,之后重新循环。
49         for(i=0;i<x;i++)
50         {
51             sum[i]=0;
52         } 
53     }
54     cout<<"The sum of the largest subarray is:"<<MaxSum<<endl;
55     system("pause");
56 }

运行截图:

总结与体会:1.最开始,为了确保求和的数组的确是矩阵,我们尝试了用一步一步的循环分别将一行矩阵,二行矩阵,三行矩阵分类相加,类内比较,再类间比较取最大的方法,但是前提是我们输入的原二维数组是3行3列的,这种情况下代码就已经很多了,而一旦数组再有任何变化就要修改整个程序,这种方法的复杂与笨拙就显示出来了。之后,我们在经过观察和总结网上的例子作参考以后,写出了以上源代码,目前为止我们都觉得这样的代码既能满足要求又比较容易理解。

2.学习了如何用new定义二维数组:

以m*n举例:
第一种方法:
int **a = new int*[m];
for(int i=0; i < m; i++)
a[i] = new int[n];
第二种方法:
int* a = new int[m*n];
a[i*n+j]是第i行第j列元素

3.双人结对编程的确可以提高效率,看来以后不仅需要提高自己的能力,更需要多多增强团队合作意识与能力。

合作美图:

( 20163953 关甜欢 20163955 王美仪 )

原文地址:https://www.cnblogs.com/guantianhuan/p/9822726.html