二维数组的子数组求最大值问题

                                                                                      二维数组求最大值问题

                                                                                                            ——杨波 崔海营

      经过几天对于整个算法的详细研究,我们发现之前提出的四种算法的猜想很大程度上是可以用代码来实现的,但是越是详细分析发现考虑的问题越深入,给我们也造成了相应的困难,所以决定当前用穷举法来完成这个程序的设计。不过在今后的学习中还会进一步的探讨之前所提出的几种猜想。其实编程的过程不仅仅是当前的,不也是长久的吗?随着知识的逐渐深入,编程水平的相应提升,相信现在的大困难,终将成为提升水平的垫脚石。

      下面是我们用穷举法编的程序:

  

#include <iostream>
using namespace std;
typedef struct sq                                //定义一个矩阵的结构体
{
    int m1;
    int n1;
    int m2;
    int n2;
}squre;
int Sum1(int *array,squre c)                     //求得子矩阵中元素的和
{
    int i,j,sum=0;
    for(i=c.m1;i<=c.m2;i++)
        for(j=c.n1;j<=c.n2;j++) 
            sum+=(*(array+i*100+j));
    
    return sum;
}
int GetMax(int * array,int m,int n)           //求取最大子矩阵的和
{
    int max,Sum;
    squre c
        ;
    for(c.m1=0;c.m1<m;c.m1++)
        for(c.n1=0;c.n1<n;c.n1++)
            for(c.m2=c.m1;c.m2<m;c.m2++)
                for(c.n2=c.n1;c.n2<n;c.n2++)
                {
                    Sum=Sum1(array,c);
                    if(max<Sum)
                    {
                        max=Sum;
                    }
                }
    return max;
}
int main()
{
    int m,n,array[100][100]={0};
    cout<<"请输入二维数组的行数:"<<endl;
    cin>>m;
    cout<<"请输入二维数组的列数:"<<endl;
    cin>>n;
    cout<<"请输入二维数组的"<<m*n<<"个元素值:"<<endl;
    for(int i=0;i<m;i++)
        for(int j=0;j<n;j++)
            cin>>array[i][j];
        cout<<"该二维数组中最大子数组的和为:"<<endl;
    cout<<GetMax(*array,m,n)<<endl;
    return 0;
}

 附录:时间记录日志(2014年)

工作人 时间 工作内容
杨波,崔海营  3.17 12:30-13:50  讨论方法设计
杨波  3.17 14:40-16:20  四种设计思想及发布
 崔海营,杨波  3.19  13:15-14:24  讨论编码设计
  崔海营 3.19    14:30-15:38  代码编写
 杨波  3.19   15:40-16:20  代码编写
 崔海营 3.19     16:30-17:15   博文编写
原文地址:https://www.cnblogs.com/chysly/p/3611294.html