点此看题面

大致题意: 给你一个\(N*M\)的\(01\)矩阵,要求你分别求出最大的\(01\)相间的正方形和矩形(矩形也可以是正方形),并输出其面积。

题解

这题第一眼看去没什么思路,仔细想想,能发现这道题其实是一道单调栈的运用题。

我们可以先对矩阵上的每一个元素进行预处理,求出以其为底的最长的 \(01\)柱

然后对矩形(正方形)的下界进行枚举,即枚举每一行作为矩形(正方形)的下边。

此时,我们发现,只要使连续的01柱连续距离和这些\(01\)柱中最短的\(01\)柱的高度的乘积最大,就可以求出最大的矩形(最大的正方形同理)。

那么,我们该如何求出每一种情况呢?这时候就要用到单调栈

我们可以建立一个严格递增的单调栈,每当单调栈栈顶的元素被弹出,我们就求出以它为右边界的最大矩阵。可以保证这样不会遗漏正确答案。

代码

#include<bits/stdc++.h>
#define N 2000
using namespace std;
int n,m,ans1,ans2,Stack[N+5],Val[N+5],a[N+5][N+5],h[N+5][N+5];
inline char tc()
{static char ff[100000],*A=ff,*B=ff;return A==B&&(B=(A=ff)+fread(ff,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{x=0;int f=1;char ch;while(!isdigit(ch=tc())) if(ch=='-') f=-1;while(x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));x*=f;
}
inline void write(int x)
{if(x<0) putchar('-'),x=-x;if(x>9) write(x/10);putchar(x%10+'0');
}
int main()
{register int i,j;for(read(n),read(m),i=1;i<=n;++i)for(j=1;j<=m;++j)read(a[i][j]);for(i=1;i<=m;++i) h[1][i]=1;for(i=2;i<=n;++i)//预处理出以每个元素为底部的最长01柱 for(j=1;j<=m;++j)h[i][j]=a[i-1][j]^a[i][j]?h[i-1][j]+1:1;//若其与上方的元素不同,则其可以与其上方元素构成一个01柱,否则以当前元素作为一个新的01柱for(i=1;i<=n;++i)//枚举矩形的下界{int top,num;//top记录栈顶,num记录当前元素最大能达到的距离a[i][m+1]=a[i][m]^1,h[i][m+1]=0,Stack[top=1]=1,Val[1]=h[i][1];for(j=2;j<=m+1;++j) {num=j;if(!(a[i][j]^a[i][j-1]))//比较当前元素与前面的元素的异同,若相同,则清空栈并更新ans{while(top){ans1=max(ans1,min(Val[top],j-Stack[top]));//先记录正方形的边长,最后再将其平方ans2=max(ans2,Val[top]*(j-Stack[top]));--top;}}while(top&&h[i][j]<=Val[top])//由于要严格满足单调递增,所以要将栈中大于等于当前元素的元素弹出{ans1=max(ans1,min(Val[top],j-Stack[top]));ans2=max(ans2,Val[top]*(j-Stack[top]));num=Stack[top--];}Stack[++top]=num,Val[top]=h[i][j];//将当前元素加入栈}}return write(ans1*ans1),putchar('\n'),write(ans2),0;
}

转载于:https://www.cnblogs.com/chenxiaoran666/p/BZOJ1057.html

【BZOJ1057】[ZJOI2007] 棋盘制作(单调栈的运用)相关推荐

  1. BZOJ-1057: [ZJOI2007]棋盘制作(单调栈)

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

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

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

  3. BZOJ1057: [ZJOI2007]棋盘制作

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

  4. Bzoj1057 [ZJOI2007]棋盘制作

    Time Limit: 20 Sec  Memory Limit: 162 MB Submit: 2464  Solved: 1219 Description 国际象棋是世界上最古老的博弈游戏之一,和 ...

  5. 【题解】[ZJOI2007]棋盘制作

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

  6. 洛谷 P1169 [ZJOI2007]棋盘制作

    题目链接 P1169 [ZJOI2007]棋盘制作 题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8×8大小的黑白相 ...

  7. 洛谷 P4147 玉蟾宫 P1169 [ZJOI2007]棋盘制作(求最大子矩阵)

    题目: P4147 玉蟾宫: https://www.luogu.org/problemnew/show/P4147  P1169 [ZJOI2007]棋盘制作: https://www.luogu. ...

  8. [ZJOI2007] 棋盘制作(单调栈 / DP悬线法)

    problem 洛谷链接 solution1-单调栈 很容易想到,预处理出每个点向上最大能延伸的长度,然后对每个点求一个矩阵面积. 然后思考优化,不难想到每次对一行进行求解. 每一行的所有列一起构成了 ...

  9. ZJOI2007 棋盘制作

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

  10. 【洛谷P1169】[ZJOI2007]棋盘制作

    棋盘制作 题目链接 这个题是[USACO5.3]巨大的牛棚Big Barn和玉蟾宫的结合 一道顶两道毒瘤! 题解: 首先,棋盘有两种选法: 1.任意白格(x,y) (x+y)%2=0 ,任意黑格(x, ...

最新文章

  1. poj1466(二分图最大独立集)
  2. io密集型和cpu密集型java,如何设计CPU密集型与I/O密集型程序
  3. 【Python面试】 说说Python面向对象三大特性?
  4. JVM调优总结(2):基本垃圾回收算法
  5. leetcode197. 上升的温度(SQL)
  6. 惯性导航算法_自动驾驶关键技术报告:惯性导航和背后的芯片大战
  7. 深入理解PHP+Mysql分布式事务与解决方案
  8. 选修课期末html作业,中南大学生命科学导论选修课期末作业
  9. Using Swift with Cocoa and Objective-C(Swift 2.0版):开始--基础设置-备
  10. webform窗体怎么实现session唯一标识_微信小程序用户登录和登录态维护的实现_javascript技巧...
  11. 问题六十八:Phong反射模型的C++实现
  12. php 类遍历,php数组遍历类与用法示例
  13. C# 使用 windowsmedia循环播放视频
  14. cloopen(cloopen limited)
  15. bootbox.js bootbox.promt()
  16. python 四维数据怎么看性别_四维b超数据怎么看性别
  17. python制作自己的专属二维码
  18. 阵列天线相位加权 matlab,相控阵波束赋形,阵列天线设计实例
  19. coreldraw sp2精简版 x4_coreldraw x4
  20. Python编程学习3:Python 对象引用和 del 删除引用

热门文章

  1. ubuntu16 下安装freeswitch 1.8.3
  2. 手机论文查重软件哪个靠谱?
  3. Kubernetes证书相关(CFSSL)
  4. AMD已秒英特尔全家?真的吗?来看看真正公平公正的版本吧!
  5. proxy_redirect参数的作用
  6. windows时间设置
  7. [转载] 高等应用数学问题的matlab求解——第4章 线性代数问题的计算机求解
  8. Win7 下 VS2005 不能断点调试解决办法
  9. Fade To Black《消失在黑暗中》BY Metallica [转]
  10. CGLIB实现AOP,MethodInterceptor接口和Enhancer详解——Spring AOP(四)