分析 我们小组是根据同学上去讲的思路写的,主要就是正数加进来,负数跳过。想象流水一般,数据就往正数方向流动并相加。取得和最大。 题目要求: 放在一个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 相关文章: