二维连通数和最大值

题目:返回一个二维整数数组中最大联通子数组的和

思路:把二维数组的每一行看成一维数组,在一位数组中求联通的的最大子数组,都求出后判断这几组的小连通数组是否相连,把相连的的加在一起。最后在判断在上一个一维数组最大联通范围内是否有正数有则加上。

代码:

#include<iostream>
using namespace std;

void main()
{
	int m,n,i,j,smark,mmark,t2;
	int sum;
	int up[100],down[100],t[100];
	int a[100][100],b[100];
	cout<<"输入二维数组的行和列";
	cin>>m>>n;
	for(i=0;i<m;i++)
	{
		for(j=0;j<n;j++)
		{
			cin>>a[i][j];
		}
	}

	for(i=0;i<m;i++)
	{
		for(j=0;j<n;j++)
		{
			b[j]=a[i][j];
		}
		int c[100]={0};
		int sum1=0,max1=0,k;
		for(k=0;k<n;k++)
		{
			if(sum1<0)
			{
				sum1=b[k];
			}
			else
			{
				sum1=sum1+b[k];
			}
			c[k]=sum1;
		}
		max1=c[0];
		for(k=0;k<n;k++)
		{
			if (max1<c[k])
			{
				max1= c[k];
				mmark = k;
			}
		}
		for (k = mmark;k >= 0;k--)
		{
			if (c[k] == b[k])
			{
				smark = k;
				break;
			}
		}
		sum=max1;
      
		up[i]=smark;                                   
		down[i]=mmark;
		t[i]=sum;

	}
	t2=t[0];
	for(i=0;i+1<m;i++)
	{
		if(up[i]<=down[i+1] && down[i]>=up[i+1])
		{
			t2+=t[i+1];
		}
		for(j=up[i];j<up[i+1];j++)
		{
			if(a[i+1][j]>0) t2+=a[i+1][j];                   //判别独立正数
		}

	}
	cout<<t2<<endl;

}

 截图:

 

总结:这次的任务的难度系数明显提高,在思路设计时也是想到几种方案但可执行度不高,最后通过和舍友一起讨论作出如今的方案在执行中任然有一定的问题,现在的问题仍在努力的解决中,通过这次的编程对数组的的理解更加的深入,这次的任务在我开来在思路设计过程中给自己收获更大,针对这次的问题设计思路时失败再设计新丝路的过程中让自己的能力有所提高。

原文地址:https://www.cnblogs.com/lingxi/p/4460753.html