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

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

二维数组首尾相接,象个一条首尾相接带子一样。

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

求所有子数组的和的最大值。

二、设计思想:

如果数组首尾相连,那么每一个元素都可以当成是开头即从A[n]开始,到A[n-1]结束,这样的话,就相当用剪子在一开始的数组中的元素的前一位剪开。这样的话,可以建立新的三个数组,前两个数组分别盛放剪开的两部分,第三个数组则是负责把前两个数组按顺序存放起来。前两个数组的长度之和等于第三个数组长度。这样便组成了新的数组。再按照以前计算条形数组的方法计算即可。

三、程序代码:

设计思路:

参照一维整数数组求解最大子数组的方法,通过将不同行列的最大子数和加起来的方法来求解整体最大子数组的和。

实现方法:先求出每一行的最大子数组之和,之后通过比较得出最大和MaxSum,然后通过上述方法求二行的最大子数组之和并与MaxSum比较,用MaxSum存放较大值。以此类推,再求第三行,第四行。。。

最后输出。

合作过程:

两人合作探讨设计思路。

一人负责分析程序,编写代码。

另一人负责代码复审和代码测试。

主要代码:

// 2w.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
 return 0;
}
//二维整数数组最大子数组之和
  #include <iostream>
  #include <stdlib.h>
  #include <time.h>
  using namespace std;
  int main()
  {
     int E,F;
     cout << "输入二维数组的行数和列数:" << endl;
     cin >> E >> F;
     int a[5][5],line[5],sum = 0,d1 = 0;
     int MaxSum ,Maxd1,end1[5][5] = {0},end2[5][5] = {0};
     int i_max = 0,j_max = 0;
     srand((unsigned int)time(0)); 
     cout << "二维数组为:" << endl;
     for (int j = 0;j < E;j++)  
     {
         for (int k = 0;k < F;k++)
         {
            a[j][k] = rand()%50 - 25;
             cout << a[j][k] << '\t';
         }
         cout << endl;
     }
     cout << endl;
     MaxSum = a[0][0]; 
     Maxd1 = a[0][0];
     for (int i = 0;i < E;i++)
     {
         for (int i1 = 0;i1 < E-i;i1++)
         {
             for (int j = 0;j < F;j++)
             {
                 line[j] = 0;
             }
             for (int i2 = i1;i2 <= i1+i;i2++)
             {
                 for (int j = 0;j < F;j++)
                 {
                     line[j] += a[i2][j];
                 }
             }
             sum = 0;
             for (int k = 0;k < F;k++)
             {
                 sum += line[k];
                 if (sum > MaxSum)
                 {
                     MaxSum = sum;
                     end1[i][i1] = k;
                     i_max = i;      
                     j_max = i1;
                 }
                 if(sum < 0)
                 {
                     sum = 0;
                 }
             }
             for (int k = F-1;k >= 0;k--)
             {
                 d1 += line[k];
                 if (d1 > Maxd1)
                 {
                     Maxd1 = d1;
                     end2[i][i1] = k;
                 }
                 if(d1 < 0)
                 {
                     d1 = 0;
                 }
             }
         }
     }
     cout << "最大子数组为:" << endl;
     for (int k = 0;k <= i_max;k++)
     {
         for (int k1 = end2[i_max][j_max];k1 <= end1[i_max][j_max];k1++)
         {
                 cout << a[j_max+k][k1] << '\t';
         }
         cout << endl;
     }
     cout << endl;
     cout << "最大子数组的和为: " << MaxSum << endl;
  }
结果:

 

四、运行结果:

 

posted @ 2018-11-03 10:30  热心市民隔壁老王  阅读(105)  评论(0编辑  收藏  举报