返回二维数组子数组联通和最大

分析

我们小组是根据同学上去讲的思路写的,主要就是正数加进来,负数跳过。想象流水一般,数据就往正数方向流动并相加。取得和最大。

题目要求:

放在一个input.txt的文件中

数组里面有正数有负数

返回联通子数组和最大的值

结果:

#include<iostream>
using namespace std;
#include<ctime>
#include<fstream>

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<<"输入二维数组的行"<<endl;
cin>>m;
cout<<"输入二维数组的列"<<endl;
cin>>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]; //判别独立正数
}

}
//文件输出
ofstream fout("D:\input.txt",ios::binary);

for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
fout<<a[i][j]<<" ";

}
fout<<endl;
}

fout<<"最大联通子数组的和为:"<<t2<<endl;

}

同伴的链接:http://www.cnblogs.com/tyyhph/p/5352373.html

原文地址:https://www.cnblogs.com/hph1313/p/5352570.html