33,008
社区成员
发帖
与我相关
我的任务
分享
// 2000-Maximum Submatrix.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
const int MAX=128;
int DL[MAX][MAX], DR[MAX][MAX], H[MAX][MAX],HL[MAX][MAX],HR[MAX][MAX];
int v[MAX][MAX];
int max(int x, int y)
{
return x>y?x:y;
}
int min(int x, int y)
{
return x<y?x:y;
}
int _tmain(int argc, _TCHAR* argv[])
{
int i,j,N,M,ans;
int t,ansx,ansy;
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&N,&M);
for(i=1;i<=N;i++)
for(j=1;j<=M;j++)
scanf("%d",&v[i][j]);
memset(H,0,sizeof(H));
for(i=1;i<=N;i++)
for(j=1;j<=M;j++)
{
if(v[i][j]==1) H[i][j]=H[i-1][j]+1;
else H[i][j]=0;
}
memset(HL,0,sizeof(HL));
for(j=1;j<=M;j++)
for(i=1;i<=N;i++)
{
if(v[i][j]==1) HL[i][j]=HL[i][j-1]+1;
else HL[i][j]=0;
}
memset(HR,0,sizeof(HR));
for(j=M;j>=1;j--)
for(i=1;i<=N;i++)
{
if(v[i][j]==1) HR[i][j]=HR[i][j+1]+1;
else HR[i][j]=0;
}
memset(DL,0,sizeof(DL));
for(i=1;i<=N;i++)
for(j=1;j<=M;j++)
{
if(v[i][j]==0) DL[i][j]=0;
else
{
if(H[i][j]==1) DL[i][j]=HL[i][j];
else DL[i][j]=min(DL[i-1][j],HL[i][j]);
}
}
memset(DR,0,sizeof(DR));
for(i=1;i<=N;i++)
for(j=1;j<=M;j++)
{
if(v[i][j]==0) DR[i][j]=0;
else
{
if(H[i][j]==1) DR[i][j]=HR[i][j];
else DR[i][j]=min(DR[i-1][j],HR[i][j]);
}
}
ans=0;
for(i=1;i<=N;i++)
for(j=1;j<=M;j++)
if(v[i][j]==1)
{
if(ans<max(ans,H[i][j]*(DR[i][j]+DL[i][j]-1)))
{
ans=max(ans,H[i][j]*(DR[i][j]+DL[i][j]-1));
ansx = i;
ansy = j;
}
}
printf("%d (%d,%d) (%d,%d)\n",ans,ansy-H[ansx][ansy],ansx-ans/H[ansx][ansy],ansy-1,ansx-1);
}
return 0;
}