结对开发2//返回一个二维整数组中最大子数组的和

题目:返回一个二维整数数组中最大子数组的和

要求:1.输入一个二维整型数组,数组里有正数也有负数

           2.二维数组中,连续的一个子矩阵组成一个子数组,每个子数组都有一

      3.求所有子数组和的最大值

同组人:曹建涛

 

源程序:

#include "stdafx.h"
#include <stdio.h>
int MAX(int a, int b)//求最大值
{
	if (a > b)
		return a;
	else
		return b;
}
int main(void)
{
	int a[3][6] = { { 5, 6, -3, 8, -9, 2 }, { 1, -12, 20, 0, -3, -5 }, { -9, -7, -3, 6, 7, -1 } };//初始化数组
	printf("array a:\n");
	for (int i = 0; i<3; i++)
	{
		for (int j = 0; j<6; j++)
		{
			printf("%5d", a[i][j]);
		}
		printf("\n");
	}
	int i, j, m, n, sum;	  //n为行,m为列,mn为子数组的左上角元素
	int p[3][6];              //a[i][j]为子数组的右下角元素,p[i][j]为子数组各元素之和
	int max = a[0][0];
	for (n = 0; n < 3; n++)
	{
		for (m = 0; m < 6; m++)
		{
			for (i = n; i < 3; i++)
			{
				for (j = m; j < 6; j++)
				{
					if (i == n)
					{
						if (j == m)
						{
							p[i][j] = a[i][j];
							sum = p[i][j];
							max = MAX(sum, max);

						}
						else
						{
							p[i][j] = p[i][j - 1] + a[i][j];
							sum = p[i][j];
							max = MAX(sum, max);
						}
					}
					else
					{
						if (j == m)
						{
							p[i][j] = p[i - 1][j] + a[i][j];
							sum = p[i][j];
							max = MAX(sum, max);
						}
						else
						{
							p[i][j] = p[i][j - 1] + p[i - 1][j] - p[i - 1][j - 1] + a[i][j];
							sum = p[i][j];
							max = MAX(sum, max);
						}
					}
				}
			}
		}
	}
	printf("maxsum=%d", max);
	getchar();
	getchar();
	return 0;
}

 

运行结果:

 

总结:

  在本次任务中,看似简单清晰的思路,在代码上实践起来却遇到了重重困难。最初的想法是遍历整个子数组,发现时间复杂度太大,完成起来较为困难。经过和组员一同寻找网络资料,翻阅图书,找到较为简便的思路方法,将这个方法逐步呈现在电脑屏幕上。由最初的简陋的框架,一步步将其完善。最终圆满完成了老师布置的任务。从最初的遥不可及到完成任务,是一个完善学习完善自己的一个路程,今后也会不放弃的坚持完成每一次作业,更上一层楼!

 

 

我和我小伙伴快乐的写代码的一天

posted on 2018-10-21 16:19  LINNNNNNN  阅读(290)  评论(0)    收藏  举报