二维数组求最大子矩阵的和

题目:返回一个二维整数数组中最大子数组的和

要求:

       输入一个二维整形数组,数组里有正数也有负数。

       数组中连续的一个或多个正数组成一个子数组,每个子数组都有一个和。

设计思想:

       将二维数组的所能组成的所有一维数组都存入到另一个数组中,利用求一维数组的最大子数组的和 求得。

 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 }

结果截图:

 

原文地址:https://www.cnblogs.com/L-Damon-v/p/5330329.html