2、软件工程结对开发之求二维数组中连续最大子数组之和

一、题目:

返回一个二维整数数组中最大子数组的和。

二、要求:

输入一个二维整型数组,数组里有正数也有负数。

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

求所有子数组的和的最大值。要求时间复杂度为O(n)。

结对编程要求: 两人结对完成编程任务。

一人主要负责程序分析,代码编程。

一人负责代码复审和代码测试计划。

程序要使用的数组放在一个叫 input.txt 的文件中,  文件格式是:
数组的行数,
数组的列数,
每一行的元素,  (用逗号分开)
每一个数字都是有符号32位整数, 当然, 行数和列数都是正整数。

发表一篇博客文章讲述两人合作中的过程、体会以及如何解决冲突(附结对开发的工作照)。

三、合作过程与体会

  本次试验我们是在上次试验的基础上,还是利用一维动态数组,本次用穷举法先假设一数组元素P[i][j],之后求每个子数组之和并求其最大子数组之和,首先初始化max[0][0],以(0,0)为起点,假设一数组元素P[i][j]。求起点是第a行,终点是第c行,以(i,j)为终点的的连续子数组的和,之后转换为求一维连续子数组的和;这样求得所有子数组之和,然后就开始找所有子数组中和的最大值。不过缺陷是这样时间花费比较多,而且我们没有用文件来实现,只是在程序中输入输出。

四、源程序代码

  1 #include <iostream.h>
  2 int maxSubArray(int **a,int n,int m)
  3 {
  4     int **p=new int*[n];
  5     int i,j;
  6     if(m==0||n==0)
  7         return 0;
  8     //计算p[i][j]    
  9     for(i=0;i<n;i++)
 10     {
 11         p[i]=new int[m];
 12         for(j=0;j<m;j++)
 13         {
 14             if(i==0)
 15             {
 16                 if(j==0)
 17                     p[i][j]=a[i][j];
 18                 else
 19                     p[i][j]=p[i][j-1]+a[i][j];
 20             }
 21             else
 22             {
 23                 if(j==0)
 24                     p[i][j]=p[i-1][j]+a[i][j];
 25                 else
 26                     p[i][j]=p[i][j-1]+p[i-1][j]-p[i-1][j-1]+a[i][j];
 27             }
 28         }
 29     }
 30     //计算二维数组最大子数组的和
 31     int temp;
 32     int max=a[0][0];//初始化
 33     int sum;
 34     if(m==1)
 35     {
 36         for(i=0;i<n;i++)
 37         {
 38             for(j=i;j<n;j++)
 39             {
 40                 if(i==0)
 41                 {
 42                     temp=p[j][m-1];
 43                 }
 44                 else
 45                 {
 46                     temp=p[j][m-1]-p[i-1][m-1];
 47                 }
 48                 if(sum<temp)
 49                     sum=temp;
 50             }
 51         }
 52     }
 53     else
 54     {
 55         for(i=0;i<n;i++)
 56         {
 57             for(j=i;j<n;j++)
 58             {
 59                 if(i==0)
 60                 {
 61                     temp=p[j][m-1]-p[j][m-2];
 62                 }
 63                 else
 64                 {
 65                     temp=p[j][m-1]-p[j][m-2]-p[i-1][m-1]+p[i-1][m-2];
 66                 }
 67                 for(int k=m-2;k>=0;k--)
 68                 {
 69                     if(temp<0)
 70                         temp=0;
 71                     if(i==0)
 72                     {
 73                         if(k==0)
 74                             temp+=p[j][k];
 75                         else
 76                             temp+=p[j][k]-p[j][k-1];
 77                     }
 78                     else
 79                     {
 80                         if(k==0)
 81                             temp+=p[j][k]-p[i-1][k];
 82                         else
 83                             temp+=p[j][k]-p[j][k-1]-p[i-1][k]+p[i-1][k-1];
 84                     }
 85                     if(sum<temp)
 86                         sum=temp;
 87                 }
 88             }
 89         }
 90     }
 91     return sum;
 92 }
 93 
 94 int main()
 95 {
 96     int n;//行数
 97     int    m;//列数
 98     cout<<"请输入二维数组的行数:"<<endl;
 99     cin>>n;
100     cout<<"请输入二维数组的列数"<<endl;
101     cin>>m;
102     int i,j;
103     int **a=new int*[n];
104     cout<<"请输入该二维数组元素:"<<endl;
105     for(i=0;i<n;i++)
106     {
107         a[i]=new int[m];
108         
109         for(j=0;j<m;j++)
110         {
111             cin>>a[i][j];
112         }
113     }
114     int sum;//最大字数组的和 
115     sum=maxSubArray(a,n,m);
116     cout<<"二维数组的最大子数组之和:"<<sum<<endl;
117     return 0;
118 }

 

五、工作照

 

posted @ 2015-03-24 22:02  Jameslige  阅读(159)  评论(1编辑  收藏  举报