郭志伟&王扣柱
具体思路:
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; }