题目:返回一个二维整数数组中最大子数组的和。
要求:输入一个二维整形数组,数组里有正数也有负数。二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。思路:先求每一行一维数组所有子数组的和的最大值,再与下面的其他行的最大值进行比较,看是否能重新生成一个新的数组,如果能,返回这个数组的和,如果不行,返回一维数组的和或求其他剩余子数组的最大值。为了方便起见,这里用3×3的数组。
程序代码:
#include "stdafx.h" #include "stdio.h" #include "stdlib.h" int _tmain(int argc, _TCHAR* argv[]) { int x[3][3] = {0}; int sum = 0; int max = 0; int i = 0; int j = 0; //赋值 for (i = 0; i<3; i++) { for (j = 0; j<3;j++) { x[i][j] = rand()%20-10; printf("%d\t",x[i][j] ); } } //循环 int M = x[0][0]; for (i = 0; i<3; i++) { int y = i; do { for (j = 0; j<3; j++) { for (int u = i; u >= y; u--) { sum = sum + x[j][u]; } max = max + sum; if (max >= M) { M =max; } if (max<0) { max = 0; } sum = 0; } y--; max = 0; } while (y >= 0); } printf("\n连续最大子数组之和:"); printf("%d\n", M); return 0; }
运行成果图:
在一起编程的照片: