要求:
输入一个二维整形数组,数组里有正数也有负数。
二维数组首尾相接,象个一条首尾相接带子一样。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。
思路:
根据前几次所做的关于一维及二维数组的思路,将其整合。
把二维数组转换成一维数组,再用求一维数组最大子数组和(环)的方式求解
1 #include<iostream> 2 #include<cstdio> 3 #include<ctime> 4 using namespace std; 5 #define M 4 6 #define N 4 7 #include <memory.h> 8 9 int maxSubArray(int *arr, int size) //最大子序列和 10 { 11 int i, sum, max1, max2, dp, min; 12 dp = max1 = arr[0]; 13 for (i = 1; i < size; ++i)//非环形数组;++i,先i自加1,再使用i的值 14 { 15 if (dp < 0) 16 dp = arr[i]; 17 else 18 dp += arr[i]; 19 if (dp > max1) 20 max1 = dp; 21 } 22 sum = min = dp = arr[0]; 23 for (i = 1; i < size; ++i)//求数组最小子数组和,再用数组全部元素和减去,则结果跨过arr[n-1]到arr[0] 24 { 25 if (dp>0) 26 dp = arr[i]; 27 else 28 dp += arr[i]; 29 if (dp < min) 30 min = dp; 31 sum += arr[i]; 32 } 33 max2 = sum - min;//数组全部元素和减去最小子数组 34 return max1>max2 ? max1 : max2;//三目运算符;如果max1>max2,将max1的值返回,否则返回max2 35 } 36 int maxSubMatrix(int n, int m, int array[M][N]) 37 { 38 int i, j, h, max, sum = -100000; 39 int b[100]; 40 for (i = 0; i<n; i++) 41 { 42 memset(b, 0, sizeof(b)); //初始化b[] 43 for (j = i; j<n; j++) //把第i行到第j行相加,对每一次相加求出最大值 44 { 45 for (h = 0; h<m; h++) 46 { 47 b[h] += array[j][h]; //二维数组压缩成一维数组,然后求最大子序列和 48 } 49 max = maxSubArray(b, h); 50 51 if (max>sum) 52 sum = max; 53 } 54 } 55 return sum; 56 } 57 int main() 58 { 59 int arr[M][N]; 60 cout << "随机二维数组为:" << endl; 61 srand(time(0)); 62 for (int i = 0; i < M; i++) 63 { 64 for (int j = 0; j < N; j++) 65 { 66 arr[i][j] = rand() % 50 - 25; 67 cout << arr[i][j] << " "; 68 } 69 cout << endl; 70 } 71 cout <<"最大子数组的和:"<< maxSubMatrix(M, N, arr) << endl; 72 return 0; 73 }
总结:每次编程结束后都应当将自己的程序保存下来,方便复用,同时,也可以看出,将程序分模块实现的好处。
时间: 2024-10-09 22:11:41