求所有子数组的和的最大值。要求时间复杂度为O(n)。
发表一篇博客文章讲述两人合作中的过程、体会以及如何解决冲突(附结对开发的工作照)。
一、设计思路
这一次,我们为了彼此更好的锻炼,我和张科同学互换位置,由张科同学负责程序分析,代码编程,由我负责代码复审和代码测试计划。我们的思路是把原来的二维数组扩展,首尾拼接,假设原来二维数组的长度为宽和高分别为n和m,即扩展成为2n-1,2m-1,必须要添加限制条件,使其行和列数量相加不得超过原来的n和m。
二、源代码
#include<stdio.h>
int rect[55][55];//二维数组行和列最大为55
int w,l; //w表示行,l表示列
int longest(int a[])
{
int i,j,find=0,max;
for(i=0;i<l;i++)
{
max=0;
for(j=i;j<2*l-2&&(j-i)<l;j++)//将二维数组长度扩展为2n-2
{
max+=a[j%l]; //行列相加不超过原来的最大行列值
if(max>find)
find=max; //find取得最大值
}
}
return find;
}
int Rect(int a[55][55])
{
int i,j,k;
int find=0; //表示最终的最大值
int b[55];
int buf;
for(i=0;i<w;i++)
{
for(j=0;j<l;j++)
b[j]=0;
for(j=i;j<2*w-2&&(j-i)<w;j++)//将二维数组长度扩展为2n-2
{
for(k=0; k<l; k++)
{
b[k]+=a[j%w][k]; //行列相加不超过原来的最大行列值
}
buf=longest(b);
if(find<buf)
find=buf;
}
}
return find;
}
int main()
{
int i,j;
int result;
printf("请输入二维数组的行和列:
");
scanf("%d%d",&w,&l);
printf("请输入二维数组:
");
for(j=0;j<w;j++)
for(i=0;i<l;i++)
scanf("%d",&rect[j][i]);
result=Rect(rect);
printf("最大子数组的和为:%d
",result);
return 0;
}
三、运行结果
四、工作体会
第一次负责代码复审,同时也是第一次坐在同学旁边,看同学编程,挑出他程序中的错误,给他的程序进行测试,让我收获颇多,有些错误,写程序的时候很难发现,但是看程序的时候就能看出来。
五、工作照