这个题 如果超级暴力做,起点i,j 终点p,q
暴力循环的话大概是n^4
所以要进行一些优化,优化掉一维数组,a[i][j]代表的是j这一列中前i个数的和,这样就可以少一重对列的循环。
和那个最大连续子串有点像。
#include<bits\stdc++.h>
using namespace std;
typedef long long ll;
#define pb push_back
const int maxn=505;
long long a[maxn][maxn];
int main(){
int n,m;
while(~scanf("%d%d",&m,&n))
{
memset(a,0,sizeof(a));
int tmp;
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&tmp),a[i][j]=a[i-1][j]+tmp;
long long ans=0;
long long sum=0;
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++)
{
sum=0;
for(int k=1;k<=m;k++)
{
sum+=a[j][k]-a[i-1][k];
if(sum<0)sum=0;
ans=max(ans,sum);
}
}
}
cout<<ans<<endl;
}
return 0;
}