一、题目及要求:
返回一个整数数组中最大子数组的和
输入一个二维整形数组,数组里有正数也有负数;二维数组首尾相接,像一条首尾相接的带子一样。
二、设计思路:
把数按行分成几个一维数组,对于该一维数组,求出他们的最大连续数组之和,并且记录下最大连续数组的第一位和最后一位的位置,之后判断几个一维数组的最大连续数组的位置是否相接或包括(如,第一行是1和4,第二行是3和5,这样就相连)。最后在加上没有包括的
#include<iostream> using namespace std; struct point { int x, y; }; int add(int a[5][5], int i, int j, int k) { int n; int b = 0; for (n = j; n <= i + j; n++) { b += a[n][k]; } return b; } void main () { int x=5,y=5,i, j, k, l; int sum = 0, s, h, e; point head; point end; int a[5][5]; int b[5]; cout << "请输入数组中的数:" << endl; for (i = 0; i<x; i++) { for (j = 0; j<y; j++) { cin>>a[i][j]; } } for (i = 0; i<x; i++) { for (j = 0; i + j<x; j++) { s = 0; h = 0; e = 0; for (k = 0; k<y; k++) { b[k] = add(a, i, j, k); } for (l = 0; l<x; l++) { s += b[l]; if (s>0) { e++; } else { s = 0; h = l + 1; e++; } if (s>sum) { sum = s; head.x = h; head.y = j; end.x = e; end.y = i + j; } } if (s>0 && h != 0) { l = 0; e = e - x; while (s>0 && e != h - 1) { s += b[l]; l++; e++; if (s>sum) { sum = s; head.x = h; head.y = j; end.x = e; end.y = i + j; } } } } } cout<<"最大子数组的和为:"<<sum<<endl; cout<<"最大子数组为:"<<endl; if (end.x>head.x) { for (i = head.y; i <= end.y; i++) { for (j = head.x; j<end.x; j++) { cout<<a[i][j]<<" "; } cout << endl; } } else { for (i = head.y; i <= end.y; i++) { for (j = head.x; j < x; j++) { cout << a[i][j] << " "; } for (j = 0; j < end.x; j++) { cout << a[i][j] << " "; } cout << endl; } } system("pause"); }
四、运行结果
五、感想
这次编写代码时明显感觉到了困难,因为二维联通数组的情况更为多变使得好多情况必须考虑,因此增加了编程的难度。
结对开发伙伴:朱建颖 http://www.cnblogs.com/zjy666/