标签:
结组成员:信1201-1柴珏辉 信1201-2邓锐
一、要求
1、题目:
返回一个二维数组中最大子数组的和。
2、要求:
二、设计思路
整体思路与上一篇首尾相连的一维数组求最大子数组的相同,在求二维数组的最大子数组程序上进行了修改,重复输入一遍数组实现环状,在行列上分别遍历,限制首尾两个位置不超过一个整体数组。
三、程序代码
1 #include<iostream.h>
2 #include<stdio.h>
3 #include<stdlib.h>
4 #include<time.h>
5 #define N 6 //行数
6 #define M 10 //列数
7 void qiuhe(int a[N][M*2],int &he,int i,int j,int k,int l) //求两个顶点数所确定的矩阵之和,[i,j]为第一个数的下标,[k,l]为第二个数的下标
8 {
9 int c,b;
10 he=0;
11 for(c=i;c<=k;c++)
12 {
13 for(b=j;b<=l;b++)
14 {
15 he=he+a[c][b];
16 }
17 }
18 }
19 void display(int a[N][M*2],int i,int j,int k,int l) //输出两个顶点数所确定的矩阵,[i,j]为第一个数的下标,[k,l]为第二个数的下标
20 {
21 int b,c;
22 for(c=i;c<=k;c++)
23 {
24 for(b=j;b<=l;b++)
25 {
26 cout<<a[c][b]<<" ";
27 }
28 cout<<endl;
29 }
30 }
31 void main()
32 {
33 int a[N][M*2];
34 srand((unsigned)time(NULL));
35 int i,j,k,l,hang1=0,hang2=0,lie1=0,lie2=0,max=a[0][0],he=0;
36 for(i=0;i<N;i++) //对二维数组中的数随机生成
37 {
38 for(j=0;j<M;j++)
39 {
40 a[i][j]=rand()%20-9;
41 a[i][j+M]=a[i][j]; //横向重复输出一遍数组,实现首尾相连
42 }
43 }
44 for(i=0;i<N;i++)
45 {
46 for(j=0;j<M;j++) //前两个循环遍历第一个顶点数
47 {
48 for(k=i;k<N;k++)
49 {
50 for(l=j;l<M+j;l++) //后两个循环遍历第二个顶点数
51 {
52 qiuhe(a,he,i,j,k,l);
53 if(he>max)
54 {
55 max=he;
56 hang1=i;
57 hang2=k;
58 lie1=j;
59 lie2=l;
60 }
61 }
62 }
63 }
64 }
65 cout<<"原数组:"<<endl;
66 display(a,0,0,N-1,M-1);
67 cout<<"最大子数组(两个顶点坐标("<<hang1+1<<","<<lie1+1<<")"<<"("<<hang2+1<<",";
68 if(lie2>M)
69 {
70 cout<<lie2+1-M<<"))"<<endl;
71 }
72 else
73 {
74 cout<<lie2+1<<"))"<<endl;
75 }
76 display(a,hang1,lie1,hang2,lie2);
77 cout<<"和为:"<<max<<endl;
78 }
截图:

四、测试
1.数组元素数量
N=600
M=1000

数据过大不能实现……
2.数据大小
a[i][j]=(rand()%20000)-10000

五、心得体会
这次的题目是在我们合作项目2基础上修改的,基本思想与上一次题目的一样,实现起来没有用太多时间,但在算法复杂度上还需要改进。
结组成员照片:

标签:
原文地址:http://www.cnblogs.com/boluoland/p/4385560.html