结对开发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;
}
运行结果:

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

我和我小伙伴快乐的写代码的一天
浙公网安备 33010602011771号