题目:返回一个二维整数数组中最大子数组的和
要求:
1.输入一个二维整型数组,数组里有正数也有负数
2.二维数组中,连续的一个子矩阵组成一个子数组,每个子数组都有一个和
3.求所有子数组和
同组人:林梦颖
源程序:
1 #include <stdio.h> 2 int MAX(int a, int b)//求最大值 3 { 4 if (a > b) 5 return a; 6 else 7 return b; 8 } 9 int main(void) 10 { 11 int a[3][6] = { { 5, 6, -3, 8, -9, 2 }, { 1, -12, 20, 0, -3, -5 }, { -9, -7, -3, 6, 7, -1 } };//先定义一个数组 12 printf("array a: "); 13 for (int i = 0; i<3; i++) 14 { 15 for (int j = 0; j<6; j++) 16 { 17 printf("%5d", a[i][j]); 18 } 19 printf(" "); 20 } 21 22 int i, j, m=3, n=6,sum; 23 int p[3][6]; 24 int max = a[0][0]; 25 for (i = 0; i<n; i++) 26 { 27 28 for (j = 0; j<m; j++) 29 { 30 if (i == 0) 31 { 32 if (j == 0) 33 { 34 p[i][j] = a[i][j]; 35 sum = p[i][j]; 36 max = MAX(sum, max); 37 38 } 39 40 else 41 { 42 p[i][j] = p[i][j - 1] + a[i][j]; 43 sum = p[i][j]; 44 max = MAX(sum, max); 45 } 46 47 } 48 else 49 { 50 if (j == 0) 51 { 52 53 p[i][j] = p[i - 1][j] + a[i][j]; 54 sum = p[i][j]; 55 max = MAX(sum, max); 56 } 57 else 58 { 59 p[i][j] = p[i][j - 1] + p[i - 1][j] - p[i - 1][j - 1] + a[i][j]; 60 sum = p[i][j]; 61 max = MAX(sum, max); 62 } 63 } 64 } 65 } 66 printf("maxsum=%d", max); 67 getchar(); 68 getchar(); 69 return 0; 70 }
运行结果:
总结: 在本次任务中,看似简单清晰的思路,在代码上实践起来却遇到了重重困难。最初的想法是遍历整个子数组,发现时间复杂度太大,完成起来较为困难。经过和组员一同寻找网络资料,翻阅图书,找到较为简便的思路方法,将这个方法逐步呈现在电脑屏幕上。由最初的简陋的框架,一步步将其完善。最终圆满完成了老师布置的任务。从最初的遥不可及到完成任务,是一个完善学习完善自己的一个路程,今后也会不放弃的坚持完成每一次作业,更上一层楼!