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子矩阵 详 ...
随机推荐
- DOS&8086微处理器
DOS DOS环境,需要安装dosemu来模拟DOS环境(Ubuntu的应用商店就有),为了编写汇编,还需要DEBUG.MASM.LINK等汇编语言开发工具.如果你嫌麻烦,推荐使用实验楼已搭好的免费的 ...
- 2017.12.24 Java序列化你不知道的事(二)
1 序列化允许重构 序列化允许一定数量的类变种,甚至重构之后也是如此,ObjectInputStream 仍可以很好地将其读出来. Java Object Serialization 规范可以自动管理 ...
- 求最大公约数和最小公倍数_python
"""写两个函数,分别求两个整数的最大公约数和最小公倍数,调用这两个函数,并输出结果.两个整数由键盘输入.""" ''' 设两个整数u和v, ...
- bootstrapValidator 插件
1 有关内容:https://blog.csdn.net/u013938465/article/details/53507109 https://blog.csdn.net/wangtongxue12 ...
- 查询Linux下已安装软件的版本
#rpm -qa | grep mysql
- S运算符&&和|| 及其优先级
a && b : 将a, b转换为Boolean类型, 再执行逻辑与, true返回b, false返回aa || b : 将a, b转换为Boolean类型, 再执行逻辑或, tru ...
- 处理侧滑返回与 ScrollView 手势冲突
与处理双击.单击手势互斥原则一样: // 手势互斥(侧滑返回手势失效后才响应UITableView的滑动手势) [tableView.panGestureRecognizer requireGestu ...
- iOS 闭包传值 和 代理传值
let vc = ViewController() let navc = UINavigationController(rootViewController: vc) window = UIWindo ...
- 二、C到C++的升级
C++ 的加强主要表现在:类型的加强.面向对象支持 1.C++改进 C++更强调语言的实用性,所有的变量都可以再需要使用的时候再定义,C语言中的变量都必须在作用域开始的位置定义 int c = 0; ...
- nuxt.js express模板项目IIS部署
继续上一篇的nuxt/express项目部署,还是windows上要把nuxt的服务端渲染项目跑起来,这次的目的是用已经有的域名windows服务器上一个虚拟目录反向代理部署在其他端口nuxt项目. ...