二维数组求子数组的最大和(严晓雄 刘三龙)
在这个程序中,我们首先设置了俩个二维数组,a[m][n]和b[m][n]。a[m][n]用来存储输入的数组,数组存入后,
我运用for循环依次对数组进行遍历,遍历的过程就是求以当前数为左顶角的所有字数组的最大值,然后将最大值存入坐标相对应的
b数组中。对数组a遍历完后再对b数组进行遍历求数组b的最大值max,max值就是所求的最大子数组的值。
下面是程序代码和运行结果:
#include "stdafx.h"
#include "stdio.h"
int m;
int max;
void Max0(int a[][3])
{
int i,j,k,m,sum,b[100];
m=0;
for(i=0;i<3;i++)
{
for(j=0;j<2;j++)
{
sum=a[i][j];
for(k=j+1;k<3;k++)
{
sum=sum+a[i][k];
b[m++]=sum;
}
}
}
for(i=0;i<3;i++)
{
for(j=0;j<2;j++)
{
sum=a[j][i];
for(k=j+1;k<3;k++)
{
sum=sum+a[k][i];
b[m++]=sum;
}
}
}
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
sum=a[i][j]+a[i+1][j];
for(k=j+1;k<3;k++)
{
sum=sum+a[i][k]+a[i+1][k];
b[m++]=sum;
}
}
}
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
sum=a[j][i]+a[j][i+1];
for(k=j+1;k<3;k++)
{
sum=sum+a[k][i]+a[k][i+1];
b[m++]=sum;
}
}
}
for(i=0;i<1;i++)
{
for(j=0;j<2;j++)
{
sum=a[i][j]+a[i+1][j]+a[i+2][j];
for(k=j+1;k<3;k++)
{
sum=sum+a[i][k]+a[i+1][k]+a[i+2][k];
b[m++]=sum;
}
}
}
for(i=0;i<1;i++)
{
for(j=0;j<2;j++)
{
sum=a[j][i]+a[j][i+1]+a[j][i+2];
for(k=j+1;k<3;k++)
{
sum=sum+a[i][k]+a[k][i+1]+a[k][i+2];
b[m++]=sum;
}
}
}
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
b[m++]=a[i][j];
}
}
max=b[0];
for(i=0;i<m;i++)
{
if(max<=b[i])
{
max=b[i];
}
}
printf("最大子数组和为:%d\n",max);
}
int main(int argc, char* argv[])
{
int num[3][3];
int i,j;
printf("请输入九个数:\n");
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
scanf("%d",&num[i][j]);
}
}
printf("生成的数组矩阵为:\n");
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf("%d ",num[i][j]);
if(j==2)
{
printf("\n\n");
}
}
}
Max0(num);
return 0;
}