二维数组求最大子矩阵的和
题目:返回一个二维整数数组中最大子数组的和
要求:
输入一个二维整形数组,数组里有正数也有负数。
数组中连续的一个或多个正数组成一个子数组,每个子数组都有一个和。
设计思想:
将二维数组的所能组成的所有一维数组都存入到另一个数组中,利用求一维数组的最大子数组的和 求得。
1 //求得二维数组Array中所能组成的所有一维数组放入到Brray中 2 //再利用求一维数组中最大子数组的和 求得每个一维数组即Brray每一列最大子数组(展开后即为Array子矩阵)的和 3 //在所有和中最大的即为二维数组Array中最大子矩阵的和 4 #include <iostream> 5 using namespace std; 6 int MaxNums(int Array[],int length) //求一维数组最大子数组的和 7 { 8 int maxSumOfArray,maxSum; 9 maxSumOfArray=maxSum=Array[0]; 10 //当我们加上一个正数时,和会增加;当我们加上一个负数时,和会减少。 11 //如果当前得到的和是个负数,那么这个和在接下来的累加中应该抛弃并重新清零,不然的话这个负数将会减少接下来的和。 12 for(int i=1;i<length;i++) 13 { 14 maxSumOfArray=max(maxSumOfArray+Array[i],Array[i]); //变量maxSumOfArray 为包含Array[i] 与Array[i] 取最大 15 maxSum=max(maxSum,maxSumOfArray); ////变量maxSum 为maxSum 与 maxSumOfArray 取最大 16 } 17 return maxSum; 18 } 19 int main() 20 { 21 int len,hig; //len为输入二维数组的列数(长) hig为输入二维数组的行数(高) 22 cout<<"输入行数"; 23 cin>>hig; 24 cout<<"输入列数"; 25 cin>>len; 26 int Array[10][10]; 27 for(int i=0;i<hig;i++) 28 { 29 for(int j=0;j<len;j++) 30 { 31 cin>>Array[i][j]; 32 } 33 } 34 int Brray[100][10]; 35 int a=0; 36 for(int i=1;i<=hig;i++) 37 { 38 a+=i; 39 } 40 for(int i=0;i<a;i++) 41 { 42 for(int j=0;j<len;j++) 43 { 44 Brray[i][j]=0; 45 } 46 } 47 // 1 列的有一种 2列的有2种 1的两个 2的一个 3的有3种... 48 //计算二维数组Array所能组成的所有一维数组 依次放入到Brray中 49 //二维数组Array所能组成的所有一维数组包括 第i列 第i列+第i+1列 第i列+第i+1列+第i+2列 ... 50 int h=0; 51 for(int n=0;n<hig;n++) 52 { 53 for(int i=0;i<hig-n;i++) 54 { 55 for(int j=0;j<len;j++) 56 { 57 for(int k=0;k<=n;k++) 58 { 59 Brray[h][j]+=Array[i+k][j]; 60 } 61 } 62 h++; 63 } 64 } 65 //输出二维数组Brray 66 /*for(int i=0;i<a;i++) 67 { 68 for(int j=0;j<len;j++) 69 { 70 cout<<Brray[i][j]<<" "; 71 } 72 cout<<endl; 73 }*/ 74 int Max=MaxNums(Brray[0],len); 75 for(int i=1;i<a;i++) 76 { 77 Max=max(Max,MaxNums(Brray[i],len)); 78 } 79 cout<<"此二维数组中最大子二维数组的和为"<<Max<<endl; 80 }
结果截图: