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

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

           二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和

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

#include <iostream>
#include <time.h>
using namespace std;
#define M 4
#define N 8
  
  void main()
  {
     int a[M][N],b[N],d = 0,d1 = 0;
     int maxd ,maxd1,end1[M][N] = {0},end2[M][N] = {0};
     int i_max = 0,j_max = 0;
 
     srand((unsigned int)time(0));    
 
     for (int j = 0;j < M;j++)
     {
         for (int k = 0;k < N;k++)
         {
             a[j][k] = rand()%100 - 50;
             cout << a[j][k] << " ";
         }    
         cout << endl;
     }
     cout << endl;    
 
     maxd = a[0][0];
     maxd1 = a[0][0];
     for (int i = 0;i < M;i++)
     {
         for (int i_hang = 0;i_hang < M-i;i_hang++)
         {
             for (int j = 0;j < N;j++)
             {
                 b[j] = 0;
             }
             for (int i_hang1 = i_hang;i_hang1 <= i_hang+i;i_hang1++)
             {
                 for (int j = 0;j < N;j++)
                 {
                     b[j] += a[i_hang1][j];
                 }
             }
             d = 0;
             for (int k = 0;k < N;k++)
             {
                 d += b[k]; 
                 if (d > maxd)
                 {
                     maxd = d;
                     end1[i][i_hang] = k;
                     i_max = i;       
                     j_max = i_hang;   
                 }
                 if(d < 0)
                 {
                     d = 0;
                 }        
             }        
         
             for (int  p= N-1;p >= 0;p--)
             {
                 d1 += b[p];
                 if (d1 > maxd1) 
                 {
                     maxd1 = d1;
                     end2[i][i_hang] = p;
                 }
                 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] << " ";
         }
         cout << endl;
    }
     
     cout << endl;
    cout << "和为: " << maxd << endl;    
 }

设计思路:一维数组求最大子数组之和的算法。在此基础上,先求出只有一行的最大子数组之和,然后将二维数组每一行最大子数组之和相比较,得到最大值。然后求每相邻两行的最大子数组之和,首先将相邻两行,同列相加,变成一个一维数组,从而求出最大子数组之和。求得之值与之前每一行最大子数组之和的结果相比。然后继续求相邻三行以此类推。最终求得二维数组最大子数组之和。
可以根据需要的二维数组的不同改变程序里M,N的值,从而完成题目。

总结:本次作业是从网页上搜索题目,加以借鉴,修改,从而完成本次的作业程序

截图:

 

posted on 2018-10-20 21:51  冶子aaa  阅读(125)  评论(0)    收藏  举报