返回二维数组子数组联通和最大
2016-04-04 18:44
302 查看
分析
我们小组是根据同学上去讲的思路写的,主要就是正数加进来,负数跳过。想象流水一般,数据就往正数方向流动并相加。取得和最大。题目要求:
放在一个input.txt的文件中数组里面有正数有负数
返回联通子数组和最大的值
[b]结果:[/b]
[b]
![](http://images2015.cnblogs.com/blog/763074/201604/763074-20160405221224593-1192365115.png)
[/b]
[b]
![](http://images2015.cnblogs.com/blog/763074/201604/763074-20160405221243703-60030379.png)
[/b]
#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
相关文章推荐
- 数据结构学习-栈和队列(3)
- 删除指定目录下的所有文件和文件夹
- iOS 系统架构
- POJ 3264 Balanced Lineup(RMQ)
- jQuery $.each用法
- php文件上传的两种实现方法
- Mark Netlink
- HOG三线性插值
- 求和思想的应用
- Win10 输入法导致程序出错
- Xcode编译 No such file or directory
- LeetCode之7 --- Reverse Integer
- nyoj860 又见01背包
- YTU 3003: 括号匹配(栈和队列)
- POJ 1276 Cash Machine 多重背包O(n*m)算法
- 批量修改文件名
- OSX 使用“终端”远程登录linux主机
- 我 && yii2 (一)
- 四则运算———安卓版
- LeetCode之7 --- Reverse Integer