您的位置:首页 > 其它

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

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

三、设计思想

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

四、源代码

#include <iostream.h>
int maxSubArray(int **a,int n,int m)
{
int **p=new int*
;
int i,j;
if(m==0||n==0)
return 0;
//计算p[i][j]
for(i=0;i<n;i++)
{
p[i]=new int[m];
for(j=0;j<m;j++)
{
if(i==0)
{
if(j==0)
p[i][j]=a[i][j];
else
p[i][j]=p[i][j-1]+a[i][j];
}
else
{
if(j==0)
p[i][j]=p[i-1][j]+a[i][j];
else
p[i][j]=p[i][j-1]+p[i-1][j]-p[i-1][j-1]+a[i][j];
}
}
}
//计算二维数组最大子数组的和
int temp;
int max=a[0][0];//初始化
int sum;
if(m==1)
{
for(i=0;i<n;i++)
{
for(j=i;j<n;j++)
{
if(i==0)
{
temp=p[j][m-1];
}
else
{
temp=p[j][m-1]-p[i-1][m-1];
}
if(sum<temp)
sum=temp;
}
}
}
else
{
for(i=0;i<n;i++)
{
for(j=i;j<n;j++)
{
if(i==0)
{
temp=p[j][m-1]-p[j][m-2];
}
else
{
temp=p[j][m-1]-p[j][m-2]-p[i-1][m-1]+p[i-1][m-2];
}
for(int k=m-2;k>=0;k--)
{
if(temp<0)
temp=0;
if(i==0)
{
if(k==0)
temp+=p[j][k];
else
temp+=p[j][k]-p[j][k-1];
}
else
{
if(k==0)
temp+=p[j][k]-p[i-1][k];
else
temp+=p[j][k]-p[j][k-1]-p[i-1][k]+p[i-1][k-1];
}
if(sum<temp)
sum=temp;
}
}
}
}
return sum;
}

int main()
{
int n;//行数
int    m;//列数
int sum;//最大子数组的和
int i,j;
cout<<"请输入二维数组的行数:"<<endl;
cin>>n;
cout<<"请输入二维数组的列数"<<endl;
cin>>m;

int **a=new int*
;
cout<<"请输入该二维数组元素:"<<endl;
for(i=0;i<n;i++)
{
a[i]=new int[m];
for(j=0;j<m;j++)
{
cin>>a[i][j];
}
}

sum=maxSubArray(a,n,m);
cout<<"二维数组的最大子数组之和:"<<sum<<endl;
return 0;
}


五、实验总结

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

六、合作照片

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: