http://www.lydsy.com/JudgeOnline/problem.php?id=1057

https://www.luogu.org/problemnew/show/P1169

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

而我们的主人公小Q,正是国际象棋的狂热爱好者。作为一个顶尖高手,他已不满足于普通的棋盘与规则,于是他跟他的好朋友小W决定将棋盘扩大以适应他们的新规则。

小Q找到了一张由N*M个正方形的格子组成的矩形纸片,每个格子被涂有黑白两种颜色之一。小Q想在这种纸中裁减一部分作为新棋盘,当然,他希望这个棋盘尽可能的大。

不过小Q还没有决定是找一个正方形的棋盘还是一个矩形的棋盘(当然,不管哪种,棋盘必须都黑白相间,即相邻的格子不同色),所以他希望可以找到最大的正方形棋盘面积和最大的矩形棋盘面积,从而决定哪个更好一些。

于是小Q找到了即将参加全国信息学竞赛的你,你能帮助他么?

参考了洛谷题解以及大量讲最大子矩阵的问题。

今天学了一天的这玩意就是为了解这道题的。

接论文的算法1和算法2,我们还可以单调栈维护dp做。

首先先把图形转换一下,引用洛谷题解。

对于图上所有的棋盘一定属于以下两种类型:

1.黑格行列奇偶性相同,白格不同

2.白格行列奇偶性相同,黑格不同

那么第一种情况的格子设为0,第二种为1。

则这道题转换成了求0或1的矩阵/正方形最大面积。

我们可以使用悬线法,这里使用单调栈为以后的学习打个基础。

我们预处理出每个格子最多可以往上延伸多少格子,单调栈维护一下,同时记录它的最远左边界。

显然如果栈没有弹出那么说明这个格子是和前面栈里的元素是割裂开的,于是正常处理。

否则不断弹出栈顶元素并且更新,同时更新我们即将加入的元素的最远左边界(就是最晚弹出的那个元素的最远左边界啦)

#include<cstdio>
#include<queue>
#include<cctype>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int N=;
inline int read(){int x;scanf("%d",&x);return x;}
int n,m,ans1,ans2,mp[N][N],nw[N][N];
int q[N][];
void init(int k){
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
if(mp[i][j]==k)nw[i][j]=nw[i-][j]+;
else nw[i][j]=;
}
}
}
void suan(int x){
int t,l=;
for(int i=;i<=m+;i++){
t=i;
while(q[l][]>=nw[x][i]&&l){
int len=min(i-q[l][],q[l][]);
ans1=max(ans1,len*len);
ans2=max(ans2,(i-q[l][])*q[l][]);
t=q[l--][];
}
q[++l][]=nw[x][i];q[l][]=t;
}
}
int main(){
n=read(),m=read();
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
int a=read();
if(((i&)==(j&)&&a)||((i&)!=(j&)&&!a))mp[i][j]=;
}
}
for(int i=;i<=;i++){
init(i);
for(int j=;j<=n;j++)suan(j);
}
printf("%d\n%d\n",ans1,ans2);
return ;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

BZOJ1057:[ZJOI2007]棋盘制作——题解的更多相关文章

  1. BZOJ1057 [ZJOI2007]棋盘制作(极大化思想)

    1057: [ZJOI2007]棋盘制作 Time Limit: 20 Sec  Memory Limit: 162 MB Submit: 1848  Solved: 936 [Submit][Sta ...

  2. BZOJ1057 [ZJOI2007]棋盘制作 【最大同色矩形】

    1057: [ZJOI2007]棋盘制作 Time Limit: 20 Sec  Memory Limit: 162 MB Submit: 3248  Solved: 1636 [Submit][St ...

  3. BZOJ1057[ZJOI2007]棋盘制作 [单调栈]

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

  4. BZOJ1057 [ZJOI2007]棋盘制作

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

  5. 洛谷 P1169||bzoj1057 [ZJOI2007]棋盘制作

    洛谷P1169 bzoj1057 这个题目跟最大全0子矩阵是类似的.正方形的话,只要把任意极大子正方形(”极大“定义见后面的”论文“)当成把某个极大子矩形去掉一块变成正方形即可,容易解决. 解法1:看 ...

  6. 【单调栈 动态规划】bzoj1057: [ZJOI2007]棋盘制作

    好像还有个名字叫做“极大化”? Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源 于易经的思想,棋盘是一个8*8大小的黑白相间的 ...

  7. bzoj1057: [ZJOI2007]棋盘制作 [dp][单调栈]

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

  8. bzoj1057: [ZJOI2007]棋盘制作--最大子矩阵

    既然要求最大01子矩阵,那么把应该为0的位置上的数取反,这样就变成求最大子矩阵 最大子矩阵可以用单调栈 #include<stdio.h> #include<string.h> ...

  9. 2018.10.19 bzoj1057: [ZJOI2007]棋盘制作(悬线法)

    传送门 悬线法板题. 如果只求最大矩形面积那么跟玉蟾宫是一道题. 现在要求最大正方形面积. 所以每次更新最大矩形面积时用矩形宽的平方更新一下正方形答案就行了. 代码: #include<bits ...

随机推荐

  1. Redis系列五 Redis持久化

    Redis持久化 一.RDB(Redis DataBase) 1.介绍 在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里. Red ...

  2. jenkins通过maven指定testng的xml文件,并给testng代码传参

    1.jenkins设置参数化构建,设置要传的参数名和值 2.指定testng的xml文件,在jenkins的输入以下 3.在pom.xml文件分别引用jenkins的参数,设置两个property & ...

  3. Consul初体验

      Preface       Today I'm gonna implement a consul in my environment to discover service of MySQL da ...

  4. OSG-获取OSG的源代码和第三方库并编译

    获取OSG的源代码有很多方式. 这里说下其中的两个地方,第一就是中国的OSG网站http://www.osgchina.org/,这个网站目前应该是由中国西安恒歌科技维护,同时,西安恒歌科技也是一家已 ...

  5. OSG-简单模型控制

    本文转至http://www.cnblogs.com/shapherd/archive/2010/08/10/osg.html 作者写的比较好,再次收藏,希望更多的人可以看到这个文章 互联网是是一个相 ...

  6. 前端开发工程师 - 05.产品前端架构 - 协作流程 & 接口设计 & 版本管理 & 技术选型 &开发实践

    05.产品前端架构 第1章--协作流程 WEB系统 角色定义 协作流程 职责说明 第2章--接口设计 概述 接口规范 规范应用 本地开发 第3章--版本管理 见 Java开发工程师(Web方向) - ...

  7. leetcode-颜色分类

     颜色分类     给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中,我们使用整数 0. 1 和 2 分别表示 ...

  8. 悲剧文本(Broken Keyboard (a.k.a. Beiju Text),UVA 11988)

    题目描述: 题目思路: 1.使用链表来重新定位各个字符 2.用数组实现链表 3.开一个数组list[i]来存储字符数组下一个字符的位置 #include <iostream> #inclu ...

  9. ubuntu networking 与 network-manager

    刚遇到的坑,因为操作不当导致网络中断,于是手动配置了/etc/network/interfaces , 修复了系统之后发现ubuntu-desktop中的有线链接不见了,百度了一下说是networki ...

  10. 使用bing或google来翻译网页

    google代码:在</head>之后插入 <meta name="google-translate-customization" content="4 ...