求二维数组最大子数组和

郭志伟&王扣柱

具体思路:

1.假设已经确定了矩形区域的上下边界,比如说上下边界分别为第a行和第c行,接下来确定左右边界

2.可以把每一列中第a行和第c行之间元素看成一个整体,即求数组(BC[0]......BC[m-1])中和最大一组,其中BC[i]=BC[a-1][i]+...+BC[c-1][i]

3.枚举矩形上下边界,然后用一位数组情况下的方法确定左右边界,即可得到二维问题的解

#include<iostream>
#define INF 466000
using namespace std;
int A[4][5]={{1,-2,6,-5,4},{3,2,-1,-3,-4},{5,-1,2,-1,3},{3,1,7,-6,9}};
int BC(int a,int c,int k)
{
    int sum=0;
    int i;
    for(i=a-1;i<c;i++)
        sum=sum+A[i][k-1];
    return sum;
}
int MaxSum(int n,int m)
{
    int maximum=-INF,i;
    int a,c,sum=0,All=0;
    for(a=1;a<=n;a++)
    {
        for(c=1;c<=n;c++)
        {
            All=BC(a,c,1);
            sum=BC(a,c,1);
            for(i=2;i<=m;i++)
            {
                if(sum<0)
                    sum=0;
                sum+=BC(a,c,i);
                if(sum>All)
                    All=sum;
                if(All>maximum)
                    maximum=All;
            }
        }
    }
        return maximum;
}
int main()
{
    
    int max=MaxSum(4,5);
    cout<<max<<endl;
    return 0;
}

原文地址:https://www.cnblogs.com/guozw/p/3628593.html