【题目描述】

国际象棋是世界上最古老的博弈游戏之一,和中国的围棋、象棋以及日本的将棋同享盛名。据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应八八六十四卦,黑白对应阴阳。而我们的主人公小Q,正是国际象棋的狂热爱好者。作为一个顶尖高手,他已不满足于普通的棋盘与规则,于是他跟他的好朋友小W决定将棋盘扩大以适应他们的新规则。小Q找到了一张由N*M个正方形的格子组成的矩形纸片,每个格子被涂有黑白两种颜色之一。小Q想在这种纸中裁减一部分作为新棋盘,当然,他希望这个棋盘尽可能的大。不过小Q还没有决定是找一个正方形的棋盘还是一个矩形的棋盘(当然,不管哪种,棋盘必须都黑白相间,即相邻的格子不同色),所以他希望可以找到最大的正方形棋盘面积和最大的矩形棋盘面积,从而决定哪个更好一些。于是小Q找到了即将参加全国信息学竞赛的你,你能帮助他么?

【输入文件】

第一行包含两个整数N和M,分别表示矩形纸片的长和宽。接下来的N行包含一个N * M的01矩阵,表示这张矩形纸片的颜色(0表示白色,1表示黑色)。

【输出文件】

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

【输入样例】

3 3
1 0 1
0 1 0
1 0 0

【输出样例】

4
6
【数据规模】

对于20%的数据,N, M ≤ 80
对于40%的数据,N, M ≤ 400
对于100%的数据,N, M ≤ 2000

【题目分析】

首先把矩阵转化一下,把横纵坐标和为偶数点的值取反,这样就转化成求最大的'0'或'1'矩阵。

我们只讨论对于0的求法,对1类似。

首先是最大正方形问题,这是一个经典的DP问题,f[i,j]表示以i,j为右下角的最大正方形的边长,那么a[i,j]=0时,f[i,j]=min(f[i-1,j-1],f[i-1,j],f[i,j-1])+1,a[i,j]=1时,f[i,j]=0,f数组中的最大值即为第一问的答案。

对于第二问,我们用一个单调栈来解决。

首先枚举最大矩形的下边界,对于每一个下边界维护两个(也可以说是两次)单调栈,一次正向,一次反向,用s[i,j]表示从a[i,j]开始向上最多能扩展出几个0,如果a[i,j]=1,那么s[i,j]=0,这样维护栈中元素的s值递增,每次元素出栈时就可以确定这个元素可以向左或向右扩展多少长度了,即找到了第一个s值小于该元素的位置,然后用每个元素的s值乘以向左向右扩展的长度和去更新第二问的答案就可以了。

由于每个元素最多进栈或出栈一次,每次的复杂度为O(n),这样总的时间复杂度就是O(n^2);

【代码实现】

Code

 1 program lyd1057;
 2 var a:array[0..2000,0..2000]of 0..1;
 3     f:array[0..2000,0..2000]of longint;
 4     s:array[0..2000,0..2000]of longint;
 5     z:array[0..2000]of longint;
 6     l,r,p:array[0..2000]of longint;
 7     ans1,ans2,i,j,m,n,k,t:longint;
 8 function max(a,b:longint):longint;
 9 begin
10     if a>b then exit(a)
11     else exit(b);
12 end;
13 function min(a,b:longint):longint;
14 begin
15     if a<b then exit(a)
16     else exit(b);
17 end;
18 procedure dp(o:longint);
19 var i,j:longint;
20 begin
21     for i:=1 to n do
22       if a[1,i]=o then s[1,i]:=1;
23     for i:=2 to m do
24       for j:=1 to n do
25         if a[i,j]=o then s[i,j]:=s[i-1,j]+1
26         else s[i,j]:=0;
27     for i:=1 to m do
28       for j:=1 to n do
29       begin
30           if a[i,j]=o then f[i,j]:=min(f[i-1,j-1],min(f[i-1,j],f[i,j-1]))+1
31           else f[i,j]:=0;
32           ans1:=max(ans1,f[i,j]);
33       end;
34     for i:=1 to m do
35     begin
36         fillchar(l,sizeof(l),0);
37         fillchar(r,sizeof(r),0);
38         t:=0;
39         for j:=1 to n do
40         begin
41             while (t>0)and(s[i,j]<s[i,z[t]]) do
42             begin
43                 r[z[t]]:=j-z[t];
44                 dec(t);
45             end;
46             if a[i,j]=o then
47             begin
48                 inc(t);
49                 z[t]:=j;
50             end;
51         end;
52         for j:=t downto 1 do
53           r[z[j]]:=n-z[j]+1;
54         t:=0;
55         for j:=n downto 1 do
56         begin
57             while (t>0)and(s[i,j]<s[i,z[t]]) do
58             begin
59                 l[z[t]]:=z[t]-j;
60                 dec(t);
61             end;
62             if a[i,j]=o then
63             begin
64                 inc(t);
65                 z[t]:=j;
66             end;
67         end;
68         for j:=t downto 1 do
69           l[z[j]]:=z[j];
70         for j:=1 to n do
71           if a[i,j]=o then
72           begin
73               p[j]:=l[j]+r[j]-1;
74               ans2:=max(ans2,p[j]*s[i,j]);
75           end;
76     end;
77 end;
78 begin
79     readln(m,n);
80     for i:=1 to m do
81       for j:=1 to n do
82       begin
83           read(a[i,j]);
84           if (i+j)and 1=0 then a[i,j]:=1-a[i,j];
85       end;
86     dp(0);
87     dp(1);
88     ans1:=sqr(ans1);
89     writeln(ans1);
90     writeln(ans2);
91 end.

转载于:https://www.cnblogs.com/whitecloth/archive/2012/04/11/2443003.html

ZJOI2007 棋盘制作相关推荐

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

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

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

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

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

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

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

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

  5. [ZJOI2007]棋盘制作 报表统计 矩阵游戏 时态同步

    好长时间了..简要除草. 棋盘制作:经典dp... 报表统计:明显数据结构,,,但我没想出来,第一问可以用堆,第二问用平衡树. 矩阵游戏:好吧.一眼二分图,匈牙利过. 时态同步:树形dp,貌似不难,( ...

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

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

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

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

  8. 1057: [ZJOI2007]棋盘制作 - BZOJ

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

  9. BZOJ1057: [ZJOI2007]棋盘制作

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

最新文章

  1. Windows下JSON可视化工具
  2. dubbo多网卡时,服务提供者的错误IP注册到注册中心导致消费端连接不上
  3. IT 行业的创新 - 创新的迷思 (1-4)
  4. java客户端程序用什么自动化测试_五大Java自动化测试框架
  5. Eclipse设置server Locations及getServletContext().getRealPath获取到的工程目录路径
  6. 阿里巴巴开源项目汇总-(JAVA)
  7. 从入门到入土:[SEED-Lab]-SQL注入攻击|SQL Injection Attack Lab|详细说明|实验步骤|实验截图
  8. 【win32汇编】0x04 第一个窗口程序
  9. 至商3000服务器信息,至商3000软件
  10. 【转】局部变量和全局变量---------------【答不对,你还敢说你精通、熟悉python?】...
  11. HDU.2111 Saving HDU(贪心)
  12. 算法:单词匹配290. Word Pattern
  13. html5 页面3d显示不出来的,Word页面视图内容为什么在大纲视图上显示不出来?
  14. [渝粤教育] 南昌大学 生物化学 参考 资料
  15. 将pdf文件转换成word,csv文件
  16. 易基因|植物育种:ChIP-seq(组蛋白)揭示H3K36me修饰影响温度诱导的植物可变剪接和开花
  17. 身高预测c语言代码switch,C++ ,预测身高程序
  18. 语音识别:利用百度智能进行语音识别
  19. [32期] 想学PHP来兄弟连是正确的选择 初识兄弟连三周
  20. vs2008编译QT开源项目--太阳神三国杀源码分析(四) 动画

热门文章

  1. c#计算 坐标点与坐标点之间的距离
  2. Java_基础—try...catch的方式处理异常1
  3. Python的基础--对象 转
  4. 朱啸虎:几百亿资金今年注入小程序,你能抓住机会吗?
  5. 〖谷腾读书会GTC〗Digital economy
  6. 春招快到了,送你一份数据分析常见面试题
  7. Linux调试时常见问题,C程序在linux下调试时经常出现的问题
  8. asp sql 导出 excel_Mysql数据导出到excel基于python
  9. Java 中的5个代码性能提升技巧,最高提升近10倍
  10. 一文看懂高可用:异地多活