BZOJ 1057:[ZJOI2007]棋盘制作(最大01子矩阵+奇偶性)
[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子矩阵+奇偶性)的更多相关文章
- BZOJ 1057: [ZJOI2007]棋盘制作 悬线法求最大子矩阵+dp
1057: [ZJOI2007]棋盘制作 Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑 ...
- 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)) ...
- bzoj 1057: [ZJOI2007]棋盘制作 单调栈
题目链接 1057: [ZJOI2007]棋盘制作 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 2027 Solved: 1019[Submit] ...
- 悬线法 || BZOJ 1057: [ZJOI2007]棋盘制作 || Luogu P1169 [ZJOI2007]棋盘制作
题面:P1169 [ZJOI2007]棋盘制作 题解: 基本是悬线法板子,只是建图判断时有一点点不同. 代码: #include<cstdio> #include<cstring&g ...
- BZOJ 1057: [ZJOI2007]棋盘制作
Decsription 给你一个矩阵,求最大了 01相间 的矩阵. Sol DP+悬线法. 这是一个论文啊 <浅谈用极大化思想解决最大子矩形问题>--王知昆. 枚举每一根悬线,记录最左/右 ...
- 【BZOJ 1057】 1057: [ZJOI2007]棋盘制作
1057: [ZJOI2007]棋盘制作 Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源 于易经的思想,棋盘是一个8*8大小的 ...
- 1057: [ZJOI2007]棋盘制作
1057: [ZJOI2007]棋盘制作 https://www.lydsy.com/JudgeOnline/problem.php?id=1057 分析: 首先对于(i+j)&1的位置0-& ...
- 【BZOJ】1057: [ZJOI2007]棋盘制作(单调栈)
http://www.lydsy.com/JudgeOnline/problem.php?id=1057 同某一题差不多?记不清是哪题了.. 就是每一行进行单调栈维护递增的高度,在进栈和出栈维护一下长 ...
- 1057: [ZJOI2007]棋盘制作 - BZOJ
Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应八八六十四卦,黑白对应阴 ...
- 【BZOJ】1057 [ZJOI2007]棋盘制作(悬线法)
题目 传送门:QWQ 分析 先把题目给出的矩阵变换一下,如果$ a[i][j] $中$ i+j \mod 2 = 1 $那么就对$ a[i][j] $取一下反. 接着就是求原图中最大的0.1子矩阵 详 ...
随机推荐
- bzoj4622 [NOI 2003] 智破连环阵
Description B国在耗资百亿元之后终于研究出了新式武器——连环阵(Zenith Protected Linked Hybrid Zone).传说中,连环阵是一种永不停滞的自发性智能武器.但经 ...
- python 补缺收集
[http://www.cnblogs.com/happyframework/p/3255962.html] 1. 高效code 与 不常用的函数用法: #带索引的遍历 , )): print(ind ...
- Mybatis-动态 SQL语句
if标签 判断语句,用户单条件分支判断 where标签 为了简化上面where 1=1的条件拼装,我们可以采用标签来简化开发 同 foreach标签 场景:传入多个 id 查询用户信息 标签用于遍历集 ...
- 3204: 数组做函数参数--排序函数2--C语言
3204: 数组做函数参数--排序函数2--C语言 时间限制: 1 Sec 内存限制: 128 MB提交: 211 解决: 143[提交][状态][讨论版][命题人:smallgyy] 题目描述 ...
- 2018.5.25 Oracle相关的函数命令
第03章 函数 1 Oracle的函数 Oracle的函数和java中的方法一样, 能完成一定的功能 2 字符处理类函数 --需求1:把ename字段转换成小写 select lower(ename) ...
- appium---adb通过wifi连接手机
前几天接到领导的安排,想要测试下apk的耗电量,可以通过手机adb命令进行监控手机电量的变化:但是这样如果通过USB连接手机的话,USB就会自动给手机进行充电,无法达到我们想要的结果,于是想到了通过w ...
- oc描述器排序
int main(int argc, const char * argv[]) { @autoreleasepool { NSArray *array = @[CreateDict(@"王思 ...
- css中让元素隐藏的多种方法
{ display: none; /* 不占据空间,无法点击 / } { visibility: hidden; / 占据空间,无法点击 / } { position: absolute; top: ...
- mysql查询哪个表数据量最大
use information_schema;select table_name,table_rows from tables where table_schema='cargo_new' order ...
- 在生产环境下实现每天自动备份mysql数据库
1.描述 我相信很多朋友在工作都都会有这种需求,老板或领导让你每天都要备份mysql数据库,你该如何实现呢,是每天到一定的时间在服务器上敲一遍mysql的备份命令,还是想写个脚本,定时定点的自动备份呢 ...