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

一、题目:返回一个二维整数数组中最大子数组的和。
二、要求:
输入一个二维整形数组,数组里有正数也有负数。
二维数组首尾相接,象个一条首尾相接带子一样。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。

三、设计思想

  这个实验是在前几次实验的基础上,利用动态数组,为了满足首尾相连,所以在计算一次之后,要把该数放在数组的最后边,这样循环遍历最后求出最大子数组的和。

四、源代码

  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     int sum;//最大子数组的和 
 99     int i,j;
100     cout<<"请输入二维数组的行数:"<<endl;
101     cin>>n;
102     cout<<"请输入二维数组的列数"<<endl;
103     cin>>m;
104     
105     int **a=new int*[n];
106     cout<<"请输入该二维数组元素:"<<endl;
107     for(i=0;i<n;i++)
108     {
109         a[i]=new int[m];
110         for(j=0;j<m;j++)
111         {
112             cin>>a[i][j];
113         }
114     }
115     
116     sum=maxSubArray(a,n,m);
117     cout<<"二维数组的最大子数组之和:"<<sum<<endl;
118     return 0;
119 }

 

五、实验总结

  本次试验,我们俩互换了角色,我负责代码编写、程序分析,檀威负责代码复审和代码测试计划,体会到了角色互换后的不同的感受,实验中我们改了好多次,对变量的重复利用不恰当,有时候不同的含义变量我们却用了相同的变量表示,有些混乱,以后在编程时要先考虑好变量的含义,做到见名知义。

六、合作照片

posted @ 2015-04-02 19:56  Jameslige  阅读(169)  评论(0编辑  收藏  举报