结对开发之二维环数组求最大子数组的和4
2015-04-01 18:41
162 查看
结对成员:信1201-1班 黄亚萍
信1201-1班 袁亚姣
一、题目要求
要求:
输入一个二维整形数组,数组里有正数也有负数。
二维数组首尾相接,象个一条首尾相接带子一样。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)题目:返回一个二维整数数组中最大子数组的和。
二、设计思路
类似于3,将二维数组转化为一维数组来求最大子数组的和,并输出其最大子数组。
三、程序源代码
四、运行结果截图
![](http://images.cnitblog.com/blog2015/726942/201504/011839002954833.png)
![](http://images.cnitblog.com/blog2015/726942/201504/011831337792479.png)
五、总结与心得
团队的细心与谨慎,以及思维的缜密是个人无法比拟的。当自己陷入迷茫时,队友的一个提醒与点播往往就能使我们豁然开朗。而队员之间的默契也会使我们的工作进展更加顺利。
信1201-1班 袁亚姣
一、题目要求
要求:
输入一个二维整形数组,数组里有正数也有负数。
二维数组首尾相接,象个一条首尾相接带子一样。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)题目:返回一个二维整数数组中最大子数组的和。
二、设计思路
类似于3,将二维数组转化为一维数组来求最大子数组的和,并输出其最大子数组。
三、程序源代码
#include <iostream> #include <fstream> using namespace std; # define M 100 # define N 100 int hang1=0; int hang2=0; int lie1=0; int lie2=0; int maxx = -100; int sum1(int k,int a[],int number) //一维数组行数元素求和 { int x=0; for(int i=k;i<=number+k-1;i++) //数组元素的个数为number { x=x+a[i]; } return x; } int sum2(int k,int a[M] ,int number,int num) //二维数组列数元素求和 { int x=0; for(int i=k;i<=number+k-1;i++) { x=x+a[i][num]; } return x; } int Largest1(int list1[],int length) //一维数组求数组的子数组的和的最大值 { int sum ; int i,j,max=-100; for(i=1;i<=length;i++) //元素个数为i { for(j=1;j<=2*length-i;j++) //子数组的第j个元素,求最大值 { sum[j]=sum1(j,list1,i); if(sum[j]>=max) { max=sum[j]; } } } return max; } void Largest3(int list[],int length) { int sum ; int i,j; for(i=1;i<=length;i++) { for(j=1;j<=2*length-i;j++) { sum[j]=sum1(j,list,i); if(sum[j]> maxx) { maxx=sum[j]; lie1 = j; lie2 = j+i-1; } } } } int Largest2(int list[M] ,int number_x,int number_y) //二维数组求数组的子数组的和的最大值 { int max,m; int max2 ; int sum[M] ; int max3 ; for(int i=1;i<=number_x;i++) //数组行数为i { cout<<"子数组行数为"<<i<<","<<endl; for(m=1;m<=number_x-i+1;m++) //子数组的第一行为原数组的第m行 { cout<<" 第"<< m <<"行的最大值为:"; for(int j=1;j<=2*number_y-1;j++) //子数组第j列元素 { sum[i][j]=sum2(m,list,i,j); } Largest3(sum[i],number_y); max2[m]=Largest1(sum[i],number_y); //数行数为i时子数组第m行的最大值 cout<<max2[m]<<endl; max3[i]=max2[1]; for(int k=1;k<=i;k++) { if(max2[k]>max3[i]) { max3[i]=max2[k]; hang1=m; } } } } max=max3[1]; for(int n=1;n<=number_x;n++) { if(max3 >=max) { max=max3 ; hang1=m; hang2=n; //子数组的行数为第m行到第m+n行 } } return max; } void show(int arry ,int length1,int length2) //输出矩阵 { for(int i=1;i<=length1;i++) { for(int j=1;j<=length2;j++) { cout<<arry[i][j]<<"\t"; } cout<<endl; } } int main(int argc, char* argv[]) { int i,j,number_hang,number_lie; int list[M] ,list1[M] ; ifstream infile("input.txt"); if(!infile) cout<<"读取失败!"<<endl; else { infile>>number_hang>>number_lie; for(int i=1;i<=number_hang;i++) { for(int j=1;j<=number_lie;j++) { infile>>list[i][j]; } } } cout<<"以矩阵形式展示为:"<<endl; show(list,number_hang,number_lie); cout<<endl; cout<<"等价转换的数组为:"<<endl; for(j=1;j<=number_hang;j++) { for( i=1;i<=2*number_lie-1;i++) { if(i<=number_lie) { list1[j][i]=list[j][i]; } else { list1[j][i]=list[j][i-number_lie]; } cout<<list1[j][i]<<" "; } cout<<endl; } cout<<"最大值为:"<<Largest2(list1,number_hang,number_lie)<<endl; cout<<endl; cout<<"对应的最大值的子数组为:"<<endl; for(i=hang1-1;i<hang2+hang1-1;i++) { for(int j=lie1;j<=lie2;j++) { cout<<list1[i][j]<<"\t"; } cout<<endl; } cout<<endl; return 0; }
四、运行结果截图
![](http://images.cnitblog.com/blog2015/726942/201504/011839002954833.png)
![](http://images.cnitblog.com/blog2015/726942/201504/011831337792479.png)
五、总结与心得
团队的细心与谨慎,以及思维的缜密是个人无法比拟的。当自己陷入迷茫时,队友的一个提醒与点播往往就能使我们豁然开朗。而队员之间的默契也会使我们的工作进展更加顺利。
相关文章推荐
- 结对开发之《返回一个二维整数数组中最大子数组的和》
- 结对开发之返回一个二维整数数组中最大联通子数组的和
- 结对开发(求二维首尾相接数组的最大子数组和)
- 结对开发之《返回一个二维整数数组中最大子数组的和2》
- 结对开发之《返回一个二维整数数组中最大子数组的和》
- 结对开发Ⅱ—利用文本求二维数组最大的子数组的和
- 结对开发之返回一个整数数组中最大子数组的和
- 结对开发之《返回一个整数数组中最大子数组的和》
- 3月17号周二课堂练习:结对开发----返回一个整数数组中最大子数组的和一
- 结对开发Ⅳ——一维数组求和最大的子数组(大数溢出)
- 结对开发2__最大子数组
- 结对开发 二维数组的最大子数组和
- 结对开发之二维数组
- 软件工程结对开发之求一个数组中连续最大子数组之和
- 结对开发求二维数组值最大的子数组(只要连续即可)
- 3月27号周五课堂练习:结对开发----返回一个整数数组中最大子数组的和三
- 结对开发--求二维数组的最大子数组
- 结对开发 随机产生二维数组并求最大子数组的和
- 结对开发 随机产生数组并求最大子数组的和
- 软件工程结对开发之求二维数组中连续最大子数组之和