返回一个二维整数数组中最大子数组的和5
一、题目及要求:
题目:返回一个整数数组中最大子数组的和
要求(新加):①输入一个二维整形数组,数组里有正数也有负数;②二维数组首尾相接,像一条首尾相接的带子一样。
结对人员:孔维春 崔鹏勃
二、设计思路:
这个题目其实就是二维数组和环型数组的结合,要解决这个问题,将之前的两个问题融合一下即可。
首先解决求出二维数组中最大子数组的问题,然后沿用一维数组的方法,将第一列放到最后一列,在求出新的二维数组的最大子数组,依次求出各个二维数组的最大子数组。
三、部分源代码:
#include "stdafx.h" #include "fstream.h" #include "iostream.h" #include "stdio.h" #define MAXSIZE 50 void read(int array[][MAXSIZE],int &len1,int &len2)//读取文件信息,并写入数组 { ifstream infile("array.txt"); if(!infile) cout<<"读取失败!"<<endl; else { infile>>len1>>len2; for(int i=0;i<len1;i++) { for(int j=0;j<len2;j++) { infile>>array[i][j]; } } } } void display(int array[][MAXSIZE],int len1,int len2,int size1,int size2)//显示数组信息 { for(int i=len1;i<=size1;i++) { for(int j=len2;j<=size2;j++) { cout<<array[i][j]<<"\t"; } cout<<endl; } } int * shuchu(int m[],int szcdx,int xhy)//m[]表示要测试的数组,szchx表示数组长度,xhy表示循环条件 { int t,p; int max,sum; //缓存数组赋值 int c[10000]; int v[10000]; int o=2*szcdx; int * temp= new int[o]; for(t=szcdx-xhy-1;t<szcdx;t++) { c[t-szcdx+xhy+1]=m[t]; } //循环 for(t=xhy;t>=0;t--) { sum=0; for(p=0;p<=t;p++) { sum=sum+c[p]; } v[t]=sum; } //循环输出最大值 max=v[0]; for(t=0;t<xhy+1;t++) { if(max<=v[t]) { max=v[t]; } //printf("%d ",v[t]); temp[t]=v[t]; } return temp; } int maxs(int s[],int length)//输出最大值 { int d=s[0]; for(int f=0;f<length;f++) { if(d<=s[f]) { d=s[f]; } } return d; } int main(int argc, char* argv[]) { int len1,len2; //len1是行数,len2是列数 int x[3]; int y[3]; int *k; int *l; int array[MAXSIZE][MAXSIZE]; read(array,len1,len2); cout<<"矩阵:"<<endl; display(array,0,0,len1-1,len2-1); for(int i=0;i<3;i++) { x[i]=array[0][i]; } int e=3; int w[6]; int u[6]; int q=0; printf("数组第一行子数组的和:"); for(i=2;i>=0;i--) { k=shuchu(x,3,i); for(int r=0;r<e;r++) { w[q]=k[r]; printf("%d ",w[q]); q++; } e--; } for(int j=0;j<3;j++) { y[j]=array[1][j]; } printf("\n"); e=3; q=0; printf("数组第二行子数组的和:"); for(i=2;i>=0;i--) { l=shuchu(y,3,i); for(int r=0;r<e;r++) { u[q]=l[r]; printf("%d ",u[q]); q++; } e--; } printf("\n"); int h[6]; printf("数组包含两行的子数组的和:"); for(int m=0;m<6;m++) { h[m]=w[m]+u[m]; printf("%d ",h[m]); } int k1=maxs(w,6); int k2=maxs(u,6); int k3=maxs(h,6); int maxx=k1; if(maxx<=k2) { maxx=k2; } if(maxx<=k3) { maxx=k3; } printf("\n最大和%d\n",maxx); int r1; int p1; for(int t=0;t<2;t++) { p1=array[0][0]; r1=array[1][0]; for(q=0;q<2;q++) { array[0][q]=array[0][q+1]; array[1][q]=array[1][q+1]; } array[0][2]=p1; array[1][2]=r1; for(int i=0;i<3;i++) { x[i]=array[0][i]; } int e=3; int w[6]; int u[6]; int q=0; printf("数组第一行子数组的和:"); for(i=2;i>=0;i--) { k=shuchu(x,3,i); for(int r=0;r<e;r++) { w[q]=k[r]; printf("%d ",w[q]); q++; } e--; } for(int j=0;j<3;j++) { y[j]=array[1][j]; } printf("\n"); e=3; q=0; printf("数组第二行子数组的和:"); for(i=2;i>=0;i--) { l=shuchu(y,3,i); for(int r=0;r<e;r++) { u[q]=l[r]; printf("%d ",u[q]); q++; } e--; } printf("\n"); int h[6]; printf("数组包含两行的子数组的和:"); for(int m=0;m<6;m++) { h[m]=w[m]+u[m]; printf("%d ",h[m]); } int k1=maxs(w,6); int k2=maxs(u,6); int k3=maxs(h,6); int maxx=k1; if(maxx<=k2) { maxx=k2; } if(maxx<=k3) { maxx=k3; } printf("\n最大和%d\n",maxx); } return 0; }
四、心得体会:
刚开始做的时候我感觉非常难,不知道怎么做。但是,经过和队友的努力终于做出了。