传送门
我们可以先用O(nm)时间求出向左向右扩展的最大距离
然后O(nm)枚举下端点位置(在矩形下面的边上)
计算出当高最高时的宽度,相乘后取max
正方形同理,只要取高度和宽度的min就行了。
uses math;
var
hei,a,x,y,le,ri:array [0..2005,0..2005] of longint;
n,m,i,j,maxju,maxzh:longint;
begin
read(n,m);
for i:=1 to n do
for j:=1 to m do read(a[i,j]);
for i:=1 to n do
begin
x[i,1]:=1;
for j:=2 to m do
if (a[i,j]<>a[i,j-1]) then x[i,j]:=x[i,j-1] else x[i,j]:=j;
end;
for i:=1 to n do
begin
y[i,m]:=m;
for j:=m-1 downto 1 do
if (a[i,j]<>a[i,j+1]) then y[i,j]:=y[i,j+1] else y[i,j]:=j;
end;
maxju:=0;
maxzh:=0;
for i:=1 to n do
for j:=1 to m do
if (a[i,j]<>a[i-1,j]) and (i<>1) then begin
hei[i,j]:=hei[i-1,j]+1;
le[i,j]:=max(le[i-1,j],x[i,j]);
ri[i,j]:=min(ri[i-1,j],y[i,j]);
end
else begin
hei[i,j]:=1; le[i,j]:=x[i,j]; ri[i,j]:=y[i,j];
end;
for i:=1 to n do
for j:=1 to m do
maxju:=max(maxju,hei[i,j]*(ri[i,j]-le[i,j]+1));
for i:=1 to n do
for j:=1 to m do
maxzh:=max(maxzh,sqr(min(hei[i,j],ri[i,j]-le[i,j]+1)));
writeln(maxzh);
write(maxju);
end.