正方形没问题,长方形有问题。 第一次输出之后是求长方形,求每一个节点以最大深度为宽,向两端求长度并相加。
//
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N=2e3+10;
int mep[N][N],f[N][N],st[N][N];
int q[N],en;
int n,m,ans;
void add(int w,int dx)
{
while (st[w][q[en]]>=st[w][dx]&&en)
q[en--]=0;
q[++en]=dx;
}
int main ()
{
// freopen("P1169_4.in","r",stdin);
// freopen("P1169_4.ans","w",stdout);
scanf ("%d %d",&n,&m);
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
{
scanf ("%d",&mep[i][j]);
if ((i+j)%2==1)
mep[i][j]=(mep[i][j]+1)%2;
}
for (int i=n;i>=1;i--)
for (int j=m;j>=1;j--)
if (mep[i][j]==mep[i+1][j]&&mep[i][j]==mep[i][j+1]&&mep[i][j]==mep[i+1][j+1])
f[i][j]=min(f[i+1][j+1],min(f[i+1][j],f[i][j+1]))+1,ans=max(ans,f[i][j]);
else
f[i][j]=1;
printf ("%d\n",ans*ans),ans=0;
for (int i=n;i>=1;i--)
for (int j=1;j<=m;j++)
if (mep[i][j]==mep[i+1][j])
st[i][j]=st[i+1][j]+1;
else
st[i][j]=1;
for (int i=1;i<=n;i++)
{
while (en)
q[en--]=0;
for (int j=1;j<=m;j++)
add(i,j),f[i][j]=(j-q[en-1]-1)*st[i][j];
}
for (int i=1;i<=n;i++)
{
q[0]=n+1;
while (en)
q[en--]=0;
for (int j=m;j>=1;j--)
add(i,j),f[i][j]+=(q[en-1]-j-1)*st[i][j];
}
ans=0;
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
ans=max(ans,f[i][j]);
printf ("%d\n",ans);
return 0;
}