[luogu]P1169 [ZJOI2007]棋盘制作[DP][单调栈]
[ZJOI]棋盘制作
——!x^n+y^n=z^n
题目描述
国际象棋是世界上最古老的博弈游戏之一,和中国的围棋、象棋以及日本的将棋同享盛名。据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应八八六十四卦,黑白对应阴阳。
而我们的主人公小Q,正是国际象棋的狂热爱好者。作为一个顶尖高手,他已不满足于普通的棋盘与规则,于是他跟他的好朋友小W决定将棋盘扩大以适应他们的新规则。
小Q找到了一张由N*M个正方形的格子组成的矩形纸片,每个格子被涂有黑白两种颜色之一。小Q想在这种纸中裁减一部分作为新棋盘,当然,他希望这个棋盘尽可能的大。
不过小Q还没有决定是找一个正方形的棋盘还是一个矩形的棋盘(当然,不管哪种,棋盘必须都黑白相间,即相邻的格子不同色),所以他希望可以找到最大的正方形棋盘面积和最大的矩形棋盘面积,从而决定哪个更好一些。
于是小Q找到了即将参加全国信息学竞赛的你,你能帮助他么?
输入输出格式
输入格式:
包含两个整数N和M,分别表示矩形纸片的长和宽。接下来的N行包含一个N * M的01矩阵,表示这张矩形纸片的颜色(0表示白色,1表示黑色)。
输出格式:
包含两行,每行包含一个整数。第一行为可以找到的最大正方形棋盘的面积,第二行为可以找到的最大矩形棋盘的面积(注意正方形和矩形是可以相交或者包含的)。
输入输出样例
输入样例1#:
3 3
1 0 1
0 1 0
1 0 0
输出样例1#:
4
6
说明
对于20%的数据,N, M ≤ 80
对于40%的数据,N, M ≤ 400
对于100%的数据,N, M ≤ 2000
这题不难使人联想到最大正方形和玉蟾宫,于是我们先考虑化归,对于一个棋盘,我们会发现那些行列相间的格子(i+j必定奇偶性相)。
所以如果我们把(i,j)这个格子的颜色改变,不就是要求同色最大正方形和最大长方形面积吗?
对于第一问,我们用动态规划解决,对于第二问,我用的是单调栈,方法详见上一篇博文。
但据说luogu这题数据很水啊,心中不安...
代码:
//2017.10.30 //DP+单调栈 #include<iostream> #include<cstdio> #include<cstring> using namespace std; inline int read(); int Max(int x,int y){return x>y?x:y;} int Min(int x,int y){return x<y?x:y;} namespace lys{ ; int dp[N][N],s[N][N],a[N][N],s1[N],s2[N]; int n,m,top,ans2,ans1; void init(){ int i,j; ;i<=n;i++) ;j--) s[i][j]=a[i][j]?s[i][j+]+:; } void find(int row){ top=; int i,del; ;i<=n+;i++){ del=i; while(top&&s1[top]>=s[i][row]){ ans2=Max(ans2,s1[top]*(i-s2[top])); del=s2[top--]; } s1[++top]=s[i][row]; s2[top]=del; } } int main(){ int i,j; n=read(); m=read(); ;i<=n;i++) ;j<=m;j++){ a[i][j]=read(); ) a[i][j]^=; } ;i<=n;i++) ;j<=m;j++){ dp[i][j]=; ][j]&&a[i][j]==a[i][j-]&&a[i][j]==a[i-][j-]) dp[i][j]=Min(dp[i-][j-],Min(dp[i-][j],dp[i][j-]))+; ans1=Max(ans1,dp[i][j]); } init(); ;i<=m;i++) find(i); ;i<=n;i++) ;j<=n;j++) a[i][j]^=; init(); ;i<=m;i++) find(i); printf("%d\n%d\n",ans1*ans1,ans2); ; } } int main(){ lys::main(); ; } inline int read(){ ,ff=; char c=getchar(); '){ ; c=getchar(); } +c-',c=getchar(); return kk*ff; }
[luogu]P1169 [ZJOI2007]棋盘制作[DP][单调栈]的更多相关文章
- Luogu 1169 [ZJOI2007]棋盘制作 - 动态规划+单调栈
Description 给一个01矩阵, 求出最大的01交错的正方形和最大的01交错的矩阵 Solution 用动态规划求出最大的正方形, 用单调栈求出最大的矩阵. 在这里仅介绍求出最大正方形(求最大 ...
- bzoj1057: [ZJOI2007]棋盘制作 [dp][单调栈]
Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源 于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应八八六十四卦,黑白对应 ...
- [luogu P1169] [ZJOI2007]棋盘制作
[luogu P1169] [ZJOI2007]棋盘制作 题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的 ...
- 悬线法 || BZOJ 1057: [ZJOI2007]棋盘制作 || Luogu P1169 [ZJOI2007]棋盘制作
题面:P1169 [ZJOI2007]棋盘制作 题解: 基本是悬线法板子,只是建图判断时有一点点不同. 代码: #include<cstdio> #include<cstring&g ...
- 【BZOJ】1057: [ZJOI2007]棋盘制作(单调栈)
http://www.lydsy.com/JudgeOnline/problem.php?id=1057 同某一题差不多?记不清是哪题了.. 就是每一行进行单调栈维护递增的高度,在进栈和出栈维护一下长 ...
- 【BZOJ1057】[ZJOI2007] 棋盘制作(单调栈的运用)
点此看题面 大致题意: 给你一个\(N*M\)的\(01\)矩阵,要求你分别求出最大的\(01\)相间的正方形和矩形(矩形也可以是正方形),并输出其面积. 题解 这题第一眼看去没什么思路,仔细想想,能 ...
- P1169 [ZJOI2007]棋盘制作 DP悬线法
题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8 \times 88×8大小的黑白相间的方阵,对应八八六十四卦,黑白 ...
- [luoguP1169] [ZJOI2007]棋盘制作(单调栈)
传送门 和玉蟾宫差不多 ——代码 #include <cstdio> #include <iostream> using namespace std; ; int n, m, ...
- luogu 1169 棋盘制作(单调栈/悬线)
luogu 1169 棋盘制作(单调栈/悬线) 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应 ...
随机推荐
- Arrays.toList工具类
- 分页查询 pagecount recordcount pagesize
pagecount=(recordcount+pagesize-1)/pagesize
- SpringBoot整合jsp技术
1.修改pom.xml文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&qu ...
- python程序的模块与包
python的程序是由模块组成的,一个python文件就是一个模块,而模块一般由代码,函数,或者类组成.创建baiduHq.py模块(文件),在该模块中编写变量,函数,类,来说明在一个模块中,变量的输 ...
- 前端项目中使用jsencrypt进行字段加密
前端项目中使用jsencrypt进行字段加密. 使用步骤:①获取公钥②实例化对象③设置公钥④将所需数据进行加密然后返回. 进行一个简单的封装如下 /** * npm install jsencrypt ...
- 多线程06-Lock
; i < ; i++) { c.Increment(); c.Decrement(); ...
- MD5加密 和 自定义加密解密
public class EncryptString { /// <summary> /// MD5加密 /// </summary> /// <param name=& ...
- ES6 new Set实现数组去重
使用new Set实现数组去重必须结合for of, 如果使用for循环就实现不了 var arr = new Set([1, 2, 1, 1, 2, 3, 3, 4, 4]); for (var e ...
- 小白学Python(9)——pyecharts 绘制漏斗图 Funnel
根据pyecharts的介绍一直没有研究明白def和return的用法,无法显示完整的漏斗图,还请各位指点. 根据上文绘制bar的方法,我更改了代码,做出了漏斗图,不过和demo不一样,而且数据也会随 ...
- js的validate插件异步效验
js代码 $(function () { $("#regForm").validate({ onsubmit:true,// 是否在提交是验证 onkeyup: false, // ...