题意:在一个矩形中求和最大的子矩形。
一维问题最长连续子段和的二维扩展,分别枚举子矩形的上下界,复杂度是O(N^3)
#include <iostream>
using namespace std;
int N;
int a[110][110];
int sum[110][110]={0};
int t[110];
int res[110];
int MAX(int a,int b)
{
return a>b?a:b;
}
int main()
{
int ans=-127*100*100-100;
cin>>N;
for(int h=0;h<N;h++)
for(int w=0;w<N;w++)
{
cin>>a[w][h];
if(h==0) sum[w][h]=a[w][h];
else sum[w][h]=sum[w][h-1]+a[w][h];
}
for(int index=0;index<N;index++)
for(int l=1;index+l-1<N;l++)
{
for(int i=0;i<N;i++)
{
if(index==0) t[i]=sum[i][index+l-1];
else t[i]=sum[i][index+l-1]-sum[i][index-1];
}
res[0]=t[0];
for(int i=1;i<N;i++)
{
res[i]=MAX(0,res[i-1])+t[i];
if(res[i]>ans) ans=res[i];
}
}
cout<<ans<<endl;
return 0;
}