一.题目:
返回一个二维整数数组中最大子数组的和。
二.要求:
输入一个二维整形数组,数组里有正数也有负数。二维数组首尾相接,象个一条首尾相接带子一样。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。
三.成员
编写程序者:岳竞一
协同者:付东
四.编程思路
首先,根据一维数组原理,可以先求出每个行数组的最大子数组和。
然后,将二维3行数组分写成5行子数组的数组,3,4行为1,2和2,3行一起的子数组,5行为,1,2,3行的子数组。
最后,求比较各行最大的子数组和。
五.源代码
#include<iostream.h>
int main()
{
int x,y,n,m;
int s[10][20];
int sum[10][20];
cout<<"请输入3行4列的矩阵:"<<endl;
int a[][4]={10,-20,-1,3,8,10,3,20,-2,4,2,-19} ;
for(x=0;x<3;x++)
{
for(y=0;y<4;y++)
{
cout<<a[x][y]<<"\t";
}
cout<<endl;
}
//---------------------------以上是数组的输入
for(x=0;x<3;x++)
{
for(y=0;y<4;y++)
{
s[x][y]=a[x][y];
}
}
for(x=0;x<3;x++)
{
for(y=0;y<3;y++)
{
s[x][y+4]=a[x][y];
}
}
for(x=0;x<2;x++)
{
for(y=0;y<4;y++)
{
s[x+3][y]=a[x][y]+a[x+1][y];
}
}
for(x=0;x<2;x++)
{
for(y=0;y<3;y++)
{
s[x+3][y+4]=a[x][y]+a[x+1][y];
}
}
for(y=0;y<4;y++)
{
s[5][y]=a[0][y]+a[1][y]+a[2][y];
}
for(y=0;y<4;y++)
{
s[5][y+4]=a[0][y]+a[1][y]+a[2][y];
}
//---------------------------------------------------
for(x=0;x<6;x++)
{
for(y=0;y<7;y++)
{
sum[x][y]=s[x][y];//0-6
}
for(y=0;y<6;y++)
{
sum[x][y+7]=s[x][y]+s[x][y+1];//7-12
}
for(y=0;y<5;y++)
{
sum[x][y+13]=s[x][y]+s[x][y+1]+s[x][y+2];//13-17
}
for(y=0;y<4;y++)
{
sum[x][y+18]=s[x][y]+s[x][y+1]+s[x][y+2]+s[x][y+3];//18-21
}
}
//-------------------------------------------------------------------------//一行有22个数
/*
for(x=0;x<6;x++)
{
for(y=0;y<10;y++)
{
if(sum[x][y]==30)
cout<<x<<endl<<y<<endl;
}
}
*/
//-----------------------------
int max=sum[0][0];
for(x=0;x<6;x++)
{
for(y=0;y<22;y++)
{
if(sum[x][y]>max)
{
max=sum[x][y];
n=x;
m=y;
}
}
}
//--------------------------------------求最大数
/*
if(n<3)
{
cout<<"数组开始行:"<<n+1<<endl<<"数组结束行:"<<n+1<<endl;
}
else
{
n=n%3;
switch(0)
{
case 0:cout<<"数组开始行:"<<n<<endl<<"数组结束行:"<<n+1<<endl;break;
case 1:cout<<"数组开始行:"<<n<<endl<<"数组结束行:"<<n+1<<endl;break;
case 2:cout<<"数组开始行:"<<n<<endl<<"数组结束行:"<<n+2<<endl;break;
}
}
//-----------------------------------------------------------------------------求子数组开始的行
if(m<4)
{
cout<<"数组开始列:"<<m<<endl<<"数组开始列:"<<m<<endl;
}
else if(m>3&&m<7)
{
{
m=m%4;
switch(m)
{
case 0:cout<<"数组开始列:1"<<endl<<"数组结束列:2"<<endl;break;
case 1:cout<<"数组开始列:2"<<endl<<"数组结束列:3"<<endl;break;
case 2:cout<<"数组开始列:3"<<endl<<"数组结束列:4"<<endl;break;
case 3:cout<<"数组开始列:1"<<endl<<"数组结束列:3"<<endl;break;
}
}
}
else if(m>7)
{
m=m%8;
switch(m)
{
case 0:cout<<"数组的开始列:2"<<endl<<"数组的结束列:4"<<endl;break;
case 1:cout<<"数组的开始列:1"<<endl<<"数组的结束列:4"<<endl;break;
}
}
*/
cout<<"最大的子数组和为:max="<<max<<endl;
return 0;
}
六.结果截图
七.结对总结
这次我负责代码的复审,感觉任务不是很重,因为在同队在做程序的时候,几乎是都自己完成了程序的测试,我很难找到另外的错误。我在其中的作用更多的是一起帮助同伴编写程序,讲给他程序编写的原理,程序思路,但是程序指导和程序编写感觉不一样,各自想的东西不一样,以后在此实验吧。
原文:http://www.cnblogs.com/bmbcbyc/p/4396900.html