结对——二维数组首尾相连求最大子数组和

一、题目与要求

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

  要求、1、输入一个二维整形数组,数组里有正数也有负数。

     2、二维数组首尾相接,象个一条首尾相接带子一样。

     3、数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和

二、设计思路

  在上一次的以为循环数组的基础上,和二维数组求最大子数组相结合,将功能合并,完成题目要求。

  • 第一步、将每一行的数组作为循环数组求最大子数组
  • 第二步、通过枚举的方式,将每一种情况的和存入到新建二维数组中
  • 第三部、通过逐列计算最大子数组的方法求所有子矩阵的最大和

如:原二维数组

1 2
3 4

每行求和后、

1 1+2 2 2+1
3 3+4 4 4+3

逐列求和、

1 1+2 2 2+1
1+3 1+2+3+4 2+4 2+1+4+3
3 3+4 4 4+3

这样就求出了所有子矩阵的和,然后比较大小就可以了

三、源代码

  1 // ketang5.cpp : 定义控制台应用程序的入口点。
  2 //张世通 梁世豪
  3 
  4 #include "stdafx.h"
  5 #include "iostream"
  6 using namespace std;
  7 
  8 /*二维数组压缩函数*/
  9 void yasuo(int **Source,int **Destion,int row,int line)
 10 {//将每一行的数组元素都用枚举法求出子数组
 11     int i,j,add,count;
 12     for(i=0;i<row;i++)
 13     {
 14         count=0;
 15         for(j=0;j<line;j++)
 16         {
 17             add=0;
 18             for(int l=0;l<line;l++)                            //每一行按顺序进行枚举存入数组中
 19             {
 20                 add=add+Source[i][l+j];
 21                 Destion[i][count+l]=add;
 22             }
 23             count=count+line;
 24             Source[i][line+j]=Source[i][j];
 25         }
 26     }
 27 }
 28 
 29 /*求最大值函数*/
 30 int Max(int **Destion,int row,int line)
 31 {
 32     int i,j,add,max;
 33     max=Destion[0][0];                                                //将数组的第一个数赋值给max
 34     for(j=0;j<line;j++)
 35     {
 36         for(i=0;i<row;i++)
 37         {
 38             add=0;
 39             for(int r=0;r<row-i;r++)
 40             {
 41                 add=add+Destion[r+i][j];                            //逐列对数组进行枚举,求最大值
 42                 if(max<add)
 43                 {
 44                     max=add;
 45                 }
 46             }
 47         }
 48     }
 49     return max;
 50 }
 51 
 52 /*数组初始化*/
 53 void chushihua(int**Arr,int row,int line)
 54 {
 55     cout<<"请输入数组数据"<<endl;
 56     for(int i=0;i<row;i++)
 57     {
 58         for(int j=0;j<line;j++)
 59         {
 60             cin>>Arr[i][j];
 61         }
 62     }
 63 }
 64 
 65 int main()
 66 {
 67     char s;
 68     int row,col1,col2;                                //定义行数列数
 69     cout<<"请输入行数:";
 70     cin>>row;
 71     cout<<"请输入列数:";
 72     cin>>col1;    
 73     int **A;                                        //动态定义二维数组
 74     int **B;
 75     col2=col1*col1;
 76     A=new int*[row];
 77     for(int k=0;k<row;k++)
 78     {
 79         A[k]=new int[col1];
 80     }
 81     B=new int*[row];
 82     for(int l=0;l<row;l++)
 83     {
 84         B[l]=new int[col2];
 85     }
 86     chushihua(A,row,col1);
 87     yasuo(A,B,row,col1);
 88     int max=Max(B,row,col2);
 89     cout<<"最大子数组之和为:"<<max<<endl;
 90     cout<<endl;
 91     cout<<"是否继续(Y/N)";
 92     cin>>s;
 93     while(s!='Y'&&s!='y'&&s!='N'&&s!='n')
 94     {
 95         cout<<"输入错误,请重新输入(Y/N)";
 96         cin>>s;
 97     }
 98     if(s=='Y'||s=='y')
 99     {
100         main();
101     }
102     return 0;
103 }

四.运行截图

五.总结体会

  1.这是我和世通在软工结对开发的最后一次合作,他一直以很积极态度来促进我们之间的合作,想法很多也都很有用,总之他是一个优秀的合作伙伴,以后有机会我还想和他一起进步。

  2.我们这次的程序基本上是沿用了之前的基本思想,有了前几次的经验,感觉这次的程序的思路就像顺水推舟一般出现在脑海中,然后的实现也比较顺利。

六.合影

posted on 2015-04-02 19:44  梁世豪  阅读(256)  评论(0编辑  收藏  举报

导航