bzoj1057: [ZJOI2007]棋盘制作

来源:互联网 发布:windows ime文件 编辑:程序博客网 时间:2024/04/30 16:03

传送门
我们可以先用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.
0 0
原创粉丝点击