题目:
返回一个二维整数数组中最大子数组的和。
要求:
输入一个二维整形数组,数组里有正数也有负数。
二维数组首尾相接,象个一条首尾相接带子一样。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。
思路:从第一行开始,加一行加两行,一直将所有的二维数组转换成几个一维数组,再将上次做的一维数组首尾相接最大字数组合做成函数调用。
(1)代码:
#include<iostream>
using namespace std;
#define N 4
void maxhe(int a[],int &s,int &jmin,int &jmax)
{
int sum=a[0],b=a[0],x=0,y=0;
int j=1;
while((j-x<N)&&x<N)
{
if(b>=0)
{
b=a[j%N];
if(j<N)
x=j;
else
break;
}
else
b+=a[j%N];
if(sum>=b)
{ sum=b;y=j;}
j++;
}
sum=0;
for(int i=y+1;i<x+N;i++)
sum+=a[i%N];
s=sum;jmin=y+1;jmax=x+N-1;
int z=y%N;
if(x>=z)
{
j=1;sum=a[0];b=a[0];x=0;y=0;
while(j<N)
{
if(b<0)
{ b=a[j%N];x=j;}
else
b+=a[j%N];
if(sum<=b)
{ sum=b;y=j;}
j++;
}
s=sum;jmin=x;jmax=y;
}
else if((x==0)&&(y==(N-1)))
{
sum=a[0];b=a[0];x=0;y=0;
for(int o=1;o<N;o++)
{
if(a[o]>sum)
{sum=a[o];x=o;y=o;}
}
s=sum;jmin=x;jmax=y;
}
}
int main()
{
int a[N][N];
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
a[i][j]=rand()%6;
if(rand()%2==1)
a[i][j]=a[i][j]*(-1);
}
}
cout<<"随机生成的二维数组为:"<<endl<<endl;
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}///////////////////////////////////////////////二维数组生成
int max=a[0][0],c1=0,c2=0,l1=0,l2=0;
for(int i=0;i<N;i++)
{
for(int j=i;j<N;j++)
{
int b[N]={0};////////////////定义可以存放各行相加和的数组
for(int k=0;k<N;k++)
{
for(int l=i;l<=j;l++)
{
b[k]+=a[l][k];
}
cout<<b[k]<<" ";
int s=b[0],jmin=0,jmax=0;
maxhe(b,s,jmin,jmax);
if(s>=max)
{max=s;c1=jmin;c2=jmax;l1=i;l2=j;}
}
cout<<endl;
}
}
cout<<"二维数组最大和为:"<<max<<endl;
for(int i=l1;i<=l2;i++)
{
for(int j=c1;j<=c2;j++)
{
cout<<a[i][j%N]<<" ";
}
cout<<endl;
}
}