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

 作业要求:

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

                  2、二维数组中连续的一个子矩阵组成一个子数组。

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

 设计思想:

                  1、将二维数组分解成一维数组,使用一位数组求最大子数组之和的方法。

                  2、求得相邻两行的最大子数组之和,将相邻两行同列相加,从而得到一个一维数组,再通过一维数组求得最大子数组之和。

                  3、求得最大子数组之和的值与之前每一行最大子数组之和的结果相比较,再以此同样方式求相邻三行以及多行。

                  4、最终求得二维数组最大子数组之和。

出现的问题:

                    1、在for循环中重复定义了k

                    2、第一次进行结对编程,互相之间分工不明确,对各自的已经分工的任务履行能力不足。

                    3、刚开始的时候对二维数组和一维数组的关系不清楚,对二维数组最大子数组的和的算法不能合理分解。

                    4 、编程能力薄弱,对c语言的应用能力差。

 #include <iostream>
 #include <time.h>
 using namespace std;
 #define M 4
 #define N 4

void main()
{
    int a[M][N],b[N],c = 0,d = 0,f=0;
    int maxc ,maxd,end1[M][N] = {0},end2[M][N] = {0};
    int i_max = 0,j_max = 0;

    srand((unsigned int)time(0));    
    cout << "是否使用随机数组:1.是 2.不是";
    cin>>f;
    if(f==1)
    {
        for (int j = 0;j < M;j++)
        {
            for (int k = 0;k < N;k++)
            {
                a[j][k] = rand()%150-50;
                cout << a[j][k] << " ";
            }    
            cout << endl;
        }
    }
    else
    {
        cout<<"请输入您的4行4列二维数组";
         for (int j = 0;j < M;j++)
        {
            for (int k = 0;k < N;k++)
            {
                cin>>a[j][k];
               ;
            }    
            cout << endl;
        }
    }

    cout << endl;    

    maxc = a[0][0];
    maxd = 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];
                }
            }
            c = 0;
            for (int k = 0;k < N;k++)
            {
                c += b[k]; 
                if (c > maxc)
                {
                    maxc = c;
                    end1[i][i_hang] = k;
                    i_max = i;       
                    j_max = i_hang;
                }
                if(c < 0)
                {
                    c = 0;
                }        
            }        
        
            for ( k = N-1;k >= 0;k--)
            {
                d += b[k];
                if (d > maxd) 
                {
                    maxd = d;
                    end2[i][i_hang] = k;
                }
                if(d < 0)
                {
                    d = 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 << "这个字数组的和为: " << maxc << endl; 
    system("pause"); 
}

 运行结果:

 

总结:

        这次编程是第一次进行结对编程,编程开始前进行了任务划分,不过开始之后编写代码之外的另一个人就沦为打酱油的状态。这种类型的合作对我们两个人而言

都是一个挑战。希望下次合作能有更好的配合。 

 

posted @ 2018-10-21 11:21  DAMIAO  阅读(211)  评论(0编辑  收藏  举报