[ZJOI2007]棋盘制作
                                          时间限制: 20 Sec 内存限制: 162 MB
【题目描述】
国际象棋是世界上最古老的博弈游戏之一,和中国的围棋、象棋以及日本的将棋同享盛名。据说国际象棋起源
于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应八八六十四卦,黑白对应阴阳。而我们的主人公小Q,
正是国际象棋的狂热爱好者。作为一个顶尖高手,他已不满足于普通的棋盘与规则,于是他跟他的好朋友小W决定
将棋盘扩大以适应他们的新规则。小Q找到了一张由N*M个正方形的格子组成的矩形纸片,每个格子被涂有黑白两种
颜色之一。小Q想在这种纸中裁减一部分作为新棋盘,当然,他希望这个棋盘尽可能的大。不过小Q还没有决定是找
一个正方形的棋盘还是一个矩形的棋盘(当然,不管哪种,棋盘必须都黑白相间,即相邻的格子不同色),所以他
希望可以找到最大的正方形棋盘面积和最大的矩形棋盘面积,从而决定哪个更好一些。于是小Q找到了即将参加全
国信息学竞赛的你,你能帮助他么?
【输入】
第一行包含两个整数N和M,分别表示矩形纸片的长和宽。接下来的N行包含一个N * M的01矩阵,表示这张矩形
纸片的颜色(0表示白色,1表示黑色)。
【输出】
包含两行,每行包含一个整数。第一行为可以找到的最大正方形棋盘的面积,第二行为可以找到的最大矩形棋
盘的面积(注意正方形和矩形是可以相交或者包含的)。
【样例输入】
3 3
1 0 1
0 1 0
1 0 0
【样例输出】
4
6
【提示】
N, M ≤ 2000

分析:

我们发现,如果按题目意思直接按照黑白交替原则做很难解决,但如果转变思路,考虑第一行,我们对2,4,6,8...位置取反(0变1,1变0),这时如果奇数位置上的数与偶数位置上的数字全部相等说明实际情况下01是交错出现的,就是符合要求的棋盘的一行,对于第二行,我们对奇数位置取反,以类似方法操作,以此类推。奇数行偶数列取反,偶数行奇数列取反(其实奇奇和偶偶也行),这时,如果平面上一个矩形包含元素满足全部为0或1,它就是一个符合条件的棋盘。于是转化成了最大子矩阵问题,以0作为障碍求一次,以1作为障碍求一次,最大的矩形即为答案。

最大正方形其实差不多,所有符合条件正方形必然包含在矩形中,只要当前矩形最小边平方就是当前正方形面积的值了。

代码:

program chess;
var
a,maxl,minr,h,l,r:array[..,..]of longint;
n,i,m,j,c,ans1,ans2:longint;
function max(x,y:longint):longint;
begin
if x>y then max:=x else max:=y;
end;
function min(x,y:longint):longint;
begin
if x<y then min:=x else min:=y;
end;
procedure work(c:longint);
var i,j,s:longint;
begin
fillchar(h,sizeof(h),); fillchar(r,sizeof(r),); fillchar(l,sizeof(l),);
for i:= to m+ do begin a[,i]:=c; a[n+,i]:=c; end;
for i:= to n do
begin
maxl[i,]:=; minr[i,m+]:=m+;
for j:= to m do
if a[i,j]=c then maxl[i,j]:=j else maxl[i,j]:=maxl[i,j-];
for j:=m downto do
if a[i,j]=c then minr[i,j]:=j else minr[i,j]:=minr[i,j+];
end;
for i:= to n+ do
begin
for j:= to m do
if a[i-,j]=c then
begin
h[i,j]:=; l[i,j]:=; r[i,j]:=m+;
end else
begin
h[i,j]:=h[i-,j]+;
l[i,j]:=max(l[i-,j],maxl[i-,j]);
r[i,j]:=min(r[i-,j],minr[i-,j]);
s:=(r[i,j]-l[i,j]-)*h[i,j];
if s>ans2 then ans2:=s;
s:=sqr(min(r[i,j]-l[i,j]-,h[i,j]));
if s>ans1 then ans1:=s;
end;
end;
end; begin
readln(n,m);
for i:= to n do begin
for j:= to m do
begin
read(a[i,j]);
if (i mod =)and(j mod =) then a[i,j]:=-a[i,j];
if (i mod =)and(j mod =) then a[i,j]:=-a[i,j];
end; readln;
end;
work(); work();
writeln(ans1); writeln(ans2);
end.

BZOJ 1057:[ZJOI2007]棋盘制作(最大01子矩阵+奇偶性)的更多相关文章

  1. BZOJ 1057: [ZJOI2007]棋盘制作 悬线法求最大子矩阵+dp

    1057: [ZJOI2007]棋盘制作 Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑 ...

  2. BZOJ 1057: [ZJOI2007]棋盘制作( dp + 悬线法 )

    对于第一问, 简单的dp. f(i, j)表示以(i, j)为左上角的最大正方形, f(i, j) = min( f(i + 1, j), f(i, j + 1), f(i + 1, j + 1)) ...

  3. bzoj 1057: [ZJOI2007]棋盘制作 单调栈

    题目链接 1057: [ZJOI2007]棋盘制作 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 2027  Solved: 1019[Submit] ...

  4. 悬线法 || BZOJ 1057: [ZJOI2007]棋盘制作 || Luogu P1169 [ZJOI2007]棋盘制作

    题面:P1169 [ZJOI2007]棋盘制作 题解: 基本是悬线法板子,只是建图判断时有一点点不同. 代码: #include<cstdio> #include<cstring&g ...

  5. BZOJ 1057: [ZJOI2007]棋盘制作

    Decsription 给你一个矩阵,求最大了 01相间 的矩阵. Sol DP+悬线法. 这是一个论文啊 <浅谈用极大化思想解决最大子矩形问题>--王知昆. 枚举每一根悬线,记录最左/右 ...

  6. 【BZOJ 1057】 1057: [ZJOI2007]棋盘制作

    1057: [ZJOI2007]棋盘制作 Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源 于易经的思想,棋盘是一个8*8大小的 ...

  7. 1057: [ZJOI2007]棋盘制作

    1057: [ZJOI2007]棋盘制作 https://www.lydsy.com/JudgeOnline/problem.php?id=1057 分析: 首先对于(i+j)&1的位置0-& ...

  8. 【BZOJ】1057: [ZJOI2007]棋盘制作(单调栈)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1057 同某一题差不多?记不清是哪题了.. 就是每一行进行单调栈维护递增的高度,在进栈和出栈维护一下长 ...

  9. 1057: [ZJOI2007]棋盘制作 - BZOJ

    Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应八八六十四卦,黑白对应阴 ...

  10. 【BZOJ】1057 [ZJOI2007]棋盘制作(悬线法)

    题目 传送门:QWQ 分析 先把题目给出的矩阵变换一下,如果$ a[i][j] $中$ i+j \mod 2 = 1 $那么就对$ a[i][j] $取一下反. 接着就是求原图中最大的0.1子矩阵 详 ...

随机推荐

  1. 【洛谷3232】[HNOI2013] 游走(贪心+高斯消元)

    点此看题面 大致题意: 一个无向连通图,小\(Z\)从\(1\)号顶点出发,每次随机选择某条边走到下一个顶点,并将\(ans\)加上这条边的编号,走到\(N\)号顶点时结束.请你对边进行编号,使总分期 ...

  2. 2018.6.12 Oracle问题

    ORA-01950: 对表空间 'USERS' 无权限 创建新的用户时,要指定default tablespace,否则它会把system表空间当成自己的缺省表空间.这样做是不提倡的.估计原来创建某个 ...

  3. double类型的小数,四舍五入保留两位小数

    import java.math.BigDecimal; public class Kewai{ public static void main(String[] args) { double f = ...

  4. Cobbler自动安装的Linux系统ssh无法进入

    Linux ssh登陆老提示“permission denied,please try again” ,但是iptables已经关掉了 修改/etc/ssh/sshd_config文件.找如下的一句 ...

  5. 垂直居中一个img

    { display:table-cell; text-align:center; vertical-align:middle; }

  6. SunmmerVocation_Learning--Java数组的创建

    一维数组声明方式: type var[] 或 type[] var; 如int a[], int[] a; Java中声明数组不能指定其长度,如int a[5]是非法的. 一维数组对象的创建: Jav ...

  7. 1046: [HAOI2007]上升序列

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 5822  Solved: 2071[Submit][Status][Discuss] Descript ...

  8. Java - BigDecimal四舍五入注意事项

    如上图,精度后只有一位时,是五舍六入.     如上图,精度后只有第一位不为0时,也是五舍六入.     如上图,精度后至少有两位不为0时,才是四舍五入.  

  9. nginx下根据指定路由重定向

    前言: 最近在搭建vue后台,后端接口是PHP写的,线上构建好之后,需要请求其他域名下的接口,开发环境已经使用proxytable解决了接口问题,为了开发和生成的代码一致, 编译后的代码,放在ngin ...

  10. JZOJ 3509. 【NOIP2013模拟11.5B组】倒霉的小C

    3509. [NOIP2013模拟11.5B组]倒霉的小C(beats) (File IO): input:beats.in output:beats.out Time Limits: 1000 ms ...