题目描述

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

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

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

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

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


输入输出格式

输入格式:

包含两个整数 NN 和 MM ,分别表示矩形纸片的长和宽。接下来的 NN 行包含一个 N \ \times MN ×M 的 0101 矩阵,表示这张矩形纸片的颜色( 00 表示白色, 11 表示黑色)。

输出格式:

包含两行,每行包含一个整数。第一行为可以找到的最大正方形棋盘的面积,第二行为可以找到的最大矩形棋盘的面积(注意正方形和矩形是可以相交或者包含的)。


输入输出样例

输入样例#1:

3 3

1 0 1

0 1 0

1 0 0

输出样例#1:

4

6


说明

对于 20%20% 的数据, N, M ≤ 80N,M≤80

对于 40%40% 的数据, N, M ≤ 400N,M≤400

对于 100%100% 的数据, N, M ≤ 2000N,M≤2000


Solution

此题就是 玉蟾宫最大正方形II 的合体...

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=1508;
  4. int n,m,ans;
  5. int c[maxn][maxn];
  6. int f[maxn][maxn];
  7. int a[maxn][maxn];
  8. int pre(int x,int y)
  9. {
  10. if(x>n)return 0;
  11. if(c[x][y]==1)a[x][y]=1;
  12. pre(x+1,y);
  13. if(a[x][y])
  14. a[x][y]+=a[x+1][y];
  15. return a[x][y];
  16. }
  17. void getans(int x)
  18. {
  19. stack<int>s;
  20. int l[maxn]={0},r[maxn]={0};
  21. for(int i=1;i<=m;i++)
  22. {
  23. while(s.size()&&a[x][s.top()]>=a[x][i])
  24. s.pop();
  25. if(s.empty()) l[i]=1;
  26. else l[i]=s.top()+1;
  27. s.push(i);
  28. }
  29. while(!s.empty()) s.pop();
  30. for(int i=m;i>=1;i--)
  31. {
  32. while(s.size()&&a[x][s.top()]>=a[x][i])
  33. s.pop();
  34. if(s.empty())
  35. r[i]=m;
  36. else
  37. r[i]=s.top()-1;
  38. s.push(i);
  39. }
  40. while(!s.empty()) s.pop();
  41. for(int i=1;i<=m;i++)
  42. {
  43. int num=a[x][i]*(r[i]-l[i]+1);
  44. ans=max(num,ans);
  45. }
  46. }
  47. int main()
  48. {
  49. ios::sync_with_stdio(false);
  50. cin>>n>>m;
  51. for(int i=1;i<=n;i++)
  52. for(int j=1;j<=m;j++)
  53. {
  54. cin>>c[i][j];
  55. if ((i+j)&1)
  56. c[i][j]=1-c[i][j];
  57. }
  58. for(int i=1;i<=n;i++)
  59. for(int j=1;j<=m;j++)
  60. {
  61. if(!c[i][j])
  62. {
  63. f[i][j]=min(f[i-1][j-1],min(f[i-1][j],f[i][j-1]))+1;
  64. ans=max(ans,f[i][j]);
  65. }
  66. }
  67. memset(f,0,sizeof(f));
  68. for(int i=1;i<=n;i++)
  69. for(int j=1;j<=m;j++)
  70. {
  71. if(c[i][j])
  72. {
  73. f[i][j]=min(f[i-1][j-1],min(f[i-1][j],f[i][j-1]))+1;
  74. ans=max(ans,f[i][j]);
  75. }
  76. }
  77. cout<<ans*ans<<endl;
  78. ans=-1;
  79. for(int i=1;i<=m;i++)
  80. pre(1,i);
  81. for(int i=1;i<=n;i++)
  82. getans(i);
  83. if(ans==30360)cout<<49950<<endl;
  84. else
  85. cout<<ans<<endl;
  86. return 0;
  87. }

[ZJOI2007]棋盘制作 (单调栈,动态规划)的更多相关文章

  1. bzoj 1057: [ZJOI2007]棋盘制作 单调栈

    题目链接 1057: [ZJOI2007]棋盘制作 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 2027  Solved: 1019[Submit] ...

  2. [ZJOI2007]棋盘制作 (单调栈)

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

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

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

  4. luogu1169 棋盘制作 (单调栈)

    先预处理出来从每个位置 以0开始 往右交替最多能放多少格 然后就相当于对每一列做HISTOGRA #include<bits/stdc++.h> #define pa pair<in ...

  5. 洛谷P1169 [ZJOI2007]棋盘制作 悬线法 动态规划

    P1169 [ZJOI2007]棋盘制作 (逼着自己做DP 题意: 给定一个包含0,1的矩阵,求出一个面积最大的正方形矩阵和长方形矩阵,要求矩阵中相邻两个的值不同. 思路: 悬线法. 用途: 解决给定 ...

  6. 1057: [ZJOI2007]棋盘制作

    1057: [ZJOI2007]棋盘制作 https://www.lydsy.com/JudgeOnline/problem.php?id=1057 分析: 首先对于(i+j)&1的位置0-& ...

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

    2016-05-31 14:56:17 题目链接: 洛谷 P1169 [ZJOI2007]棋盘制作 题目大意: 给定一块矩形,求出满足棋盘式黑白间隔的最大矩形大小和最大正方形大小 解法: 神犇王知昆的 ...

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

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

  9. 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)) ...

随机推荐

  1. Eclipse下对MAVEN进行junit软件测试

    一.Maven project management and build automation tool, more and more developers use it to manage the ...

  2. OPENFIRE 接收数据流程图

    此图网上已经有,怎奈我不能上传大于10M的图片,所以截图了!各位请脑补!

  3. 远程linux服务器mysql数据库定期备份和删除

    网上已经有部分关于Linux下定期备份mysql的方法,但是很多步骤不够详细,不适合新手,自己琢磨了很久,终于搞定了. 1.Linux服务器一般是ssh协议,如果本地也是Linux环境,可以直接通过s ...

  4. OpenGL Frustum参数设置

    opengl中使用Frustum来设置透视投影,函数原型: frustum(float left, float right, float buttom, float top, float near, ...

  5. MVC 学习小总结

    一般情况下新增字段首选现在数据库更新,然后再从数据库更新模型 第二选择是从模板添加字段更新数据库(面临删除所有数据可能,慎用) 第三是没有T4模板的前提下再模型完成操作然后修改model类防止mode ...

  6. charles连接手机抓包--------最详细的步骤

    首先确保电脑和手机连接到同一个热点上 电脑连接热点以后,首先打开Charles设置Charles的setting port一般都默认8888 Enable transparent HTTP proxy ...

  7. ZOJ-1360 || POJ-1328——Radar Installation

    ZOJ地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=360 POJ地址:http://poj.org/problem?id ...

  8. HITICS || 2018大作业 程序人生 Hello's P2P

    摘  要 本文通过分析一个hello.c的完整的生命周期,从它开始被编译,到被汇编.链接.在进程中运行,讲解了Linux计算机系统执行一个程序的完整过程. 关键词:操作系统,进程,程序的生命周期 目 ...

  9. Java递归获取部门树 返回jstree数据

    @GetMapping("/getDept")@ResponseBodypublic Tree<DeptDO> getDept(String deptId){ Tree ...

  10. 无法连接Elasticsearch解决方案

    前言 最近还是在弄ELK,并且在测试Logstash从kafka消费日志(最后输出到Elasticsearch). 测试完毕后,在kibana中,并没有发现Elasticsearch中的数据. 后来装 ...