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/+

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

最新文章

  1. Quartz 在 Spring 中如何动态配置时间--转
  2. LazyMan的Promise解法
  3. JSON字符串解析
  4. RTX2010服务器端的主要通信端口有哪些?
  5. 从零基础到App Store
  6. 自己做的demo---宣告可以在java世界开始自由了
  7. Sql Server 自定义函数(原创)
  8. 2786: [JSOI]Word Query电子字典
  9. leetcode算法: Find All Duplicates in an Array
  10. 新手创建Vue项目
  11. 多个字符串有相同的hashcode(没见到大于8的时候转成红黑树)
  12. Flume数据采集准备
  13. bootstrap手风琴折叠
  14. 浅谈 Web 缓存
  15. Javascript常用语法 (一)
  16. Python3之socket编程
  17. learning uboot how to set ddr parameter in qca4531 cpu
  18. js 日期相差的天数
  19. ggplot2作图详解:入门函数qplot
  20. MVC教程一:MVC简介

热门文章

  1. tcpdump使用
  2. Android官方开发文档Training系列课程中文版:目录
  3. WeTest功能优化第3期:业内首创,有声音的云真机
  4. 接口测试工具postman(八)上传文件接口
  5. android自动化のadb常用命令(不定期更新)
  6. Python内嵌函数与Lambda表达式
  7. js 加密 crypto-js des加密
  8. JAVA基础学习之路(四)定义简单java类
  9. 基础的表ADT -数据结构(C语言实现)
  10. ionic 获取input的值