查找二维数组中子数组之和最大值 郭莉莉&&李亚文

一。

在主函数中实现二维数组的输入、

代码主要函数maxson(),主要利用for()循环先查找出最大字数组的四角的坐标xmin,xmax,ymin,ymax来确定最大子数组,

在循环中算出之和,编写过程中行列的值赋值错误,但经过调试查找出来了;后来在输出最大子数组的地方遇到麻烦,

考虑不周全用普遍的  if(j%n==0)cout<<endl;来进行换行,导致出现错误,应改为if(j%n==m),m为最大子数组的第一列,

源代码:

#include <iostream> 
using namespace std;
  
int a[100][100];
int maxson(int M,int N)
{
	int xmin,xmax,ymin,ymax;
	int m,n,p,q,t;
	int i,j,max=a[0][0],sum=0;
	for(xmin=0;xmin<M;xmin++)
	  for(xmax=xmin+1;xmax<=M;xmax++)
	       for(ymin=0;ymin<N;ymin++)
	          for(ymax=ymin+1;ymax<=M;ymax++)
		  {    sum=0;
			  for(j=xmin;j<xmax;j++)
				  for(i=ymin;i<ymax;i++)
				  {
					  sum=a[i][j]+sum;
				  }
					  if(max<sum) 
					  {
						  max=sum;
						  m=xmin; n=xmax;
						  p=ymin; q=ymax;
					  }	 
		  }
	cout<<"最大子数组为"<<endl;
	t=n-m;
	for(i=p;i<q;i++)     
	 for(j=m;j<n;j++)
	 {	 if(j%t==m)
	       cout<<endl; 
	      cout<<a[i][j]<<'	';
		 
	 }
		cout<<endl;
     return max;
	
}

void main()
{
	int M=0,N=0,i,j;
	while(!M)                               //检查输入的M,N否则重新输
	{
		cout<<"数组的行数: ";
		cin>>M;
		if(M<=0)
		{
			M=0;
			cout<<"行数必须大于0"<<endl;
		}
	}
	while(!N)
	{
		cout<<"数组的列数: ";
	    cin>>N;
		if(N<=0)
		{
			cout<<"列数必须大于0"<<endl;
			N=0;
		}
	    cout<<"输入数组的值:";       //输入二维数组的值
	    for(i=0;i<M;i++)
	    	for(j=0;j<N;j++)
			{
		    	cin>>a[i][j];
			}

	}
	cout<<"您输入的数组为:" ; //输出数组 
	for(i=0;i<M;i++)     
	 for(j=0;j<N;j++)
	 {
		 if(j%N==0)
	       cout<<endl; 
	      cout<<a[i][j]<<'	';
	 }
	 cout<<endl;
     cout<<"子数组和为:"<<maxson(M,N)<<endl;
}

 2.运行结果

原文地址:https://www.cnblogs.com/guolili/p/3611863.html