1057: [ZJOI2007]棋盘制作

Time Limit: 20 Sec  Memory Limit: 162 MB
Submit: 1848  Solved: 936
[Submit][Status][Discuss]

Description

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

Input

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

Output

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

Sample Input

3 3

1 0 1

0 1 0

1 0 0

Sample Output

4

6

HINT

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

Source

【思路】

极大化思想。

题目的第一问是经典的DP问题。

对于第二问,我们用极大化的思想求解。设悬线up[i][j]表示ij可向上延伸的最大值,L[i][j]表示ij悬线可向左延伸的最大下标,R同理。对于每一行从左向右扫描一遍,维护最靠右的不可延伸处的下标同时递推L,类似地求解R。

显然,当我们求解第二问的时候同时维护最大边长也可以解决第一问。

关于递推式:

If G[i][j]==G[i-1][j]

Up[i][j]=1;

L[i][j]=(I,j) 向左可延伸的最大下标lo。

R[i][j]=(I,j) 向右可延伸的最小下标ro。

Else

Up[i][j]=up[i-1][j]+1

L[i][j]=max(L[i-1][j],lo);

R[i][j]=min(R[i-1][j],ro);
【代码】

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. using namespace std;
  5.  
  6. const int maxn = +;
  7.  
  8. int w[maxn][maxn];
  9. int n,m;
  10.  
  11. int read_int() {
  12. char c=getchar();
  13. while(!isdigit(c)) c=getchar();
  14. int x=;
  15. while(isdigit(c)) {
  16. x=x*+c-'';
  17. c=getchar();
  18. }
  19. return x;
  20. }
  21.  
  22. /*
  23. inline bool can(int i,int j) {
  24. return (w[i][j]^w[i-1][j-1]==0 && w[i-1][j]^w[i][j-1]==0 && w[i][j]!=w[i-1][j]);
  25. }
  26. int d[maxn][maxn];
  27. void get_ans1() {
  28. int ans=0;
  29. for(int i=1;i<=n;i++)
  30. for(int j=1;j<=m;j++)
  31. {
  32. d[i][j]=1;
  33. if(i>1 && j>1 && can(i,j))
  34. {
  35. d[i][j]+=min(d[i-1][j-1],min(d[i-1][j],d[i][j-1]));
  36. ans=max(ans,d[i][j]*d[i][j]);
  37. }
  38. }
  39. cout<<ans<<"\n";
  40. }
  41. */
  42.  
  43. int L[maxn][maxn],up[maxn][maxn],R[maxn][maxn];
  44. void get_ans() {
  45. int ans1=,ans2=;
  46. for(int i=;i<=n;i++)
  47. {
  48. int lo=, ro=m+;
  49. for(int j=;j<=m;j++)
  50. {
  51. if(j== || w[i][j-]==w[i][j]) lo=j;
  52. if(i== || w[i][j]==w[i-][j]) up[i][j]=,L[i][j]=lo;
  53. else {
  54. up[i][j]=up[i-][j]+;
  55. L[i][j]=max(L[i-][j],lo);
  56. }
  57. }
  58. for(int j=m;j;j--)
  59. {
  60. if(j==m || w[i][j+]==w[i][j]) ro=j;
  61. if(i== || w[i][j]==w[i-][j]) R[i][j]=ro;
  62. else {
  63. R[i][j]=min(R[i-][j],ro);
  64. ans1=max(ans1,min(up[i][j],R[i][j]-L[i][j]+));
  65. ans2=max(ans2,up[i][j]*(R[i][j]-L[i][j]+));
  66. }
  67. }
  68. }
  69. cout<<ans1*ans1<<"\n";
  70. cout<<ans2<<"\n";
  71. }
  72. int main() {
  73.  
  74. n=read_int(); m=read_int();
  75.  
  76. for(int i=;i<=n;i++) for(int j=;j<=m;j++) w[i][j]=read_int();
  77.  
  78. get_ans();
  79.  
  80. return ;
  81. }

PS:关于极大化思想,详可参见王知昆《浅谈用极大化思想解决最大子矩形问题

BZOJ1057 [ZJOI2007]棋盘制作(极大化思想)的更多相关文章

  1. BZOJ1057 [ZJOI2007]棋盘制作 【最大同色矩形】

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

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

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

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

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

  4. BZOJ1057 [ZJOI2007]棋盘制作

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

  5. bzoj1057: [ZJOI2007]棋盘制作 [dp][单调栈]

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

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

    洛谷P1169 bzoj1057 这个题目跟最大全0子矩阵是类似的.正方形的话,只要把任意极大子正方形(”极大“定义见后面的”论文“)当成把某个极大子矩形去掉一块变成正方形即可,容易解决. 解法1:看 ...

  7. bzoj1057: [ZJOI2007]棋盘制作--最大子矩阵

    既然要求最大01子矩阵,那么把应该为0的位置上的数取反,这样就变成求最大子矩阵 最大子矩阵可以用单调栈 #include<stdio.h> #include<string.h> ...

  8. 2018.10.19 bzoj1057: [ZJOI2007]棋盘制作(悬线法)

    传送门 悬线法板题. 如果只求最大矩形面积那么跟玉蟾宫是一道题. 现在要求最大正方形面积. 所以每次更新最大矩形面积时用矩形宽的平方更新一下正方形答案就行了. 代码: #include<bits ...

  9. bzoj1057: [ZJOI2007]棋盘制作(悬线法)

    题目要求纵横坐标和奇偶性不同的点取值不同,于是我们把纵横坐标和奇偶性为1的点和0的点分别取反,就变成经典的最大全1子矩阵问题了,用悬线法解决. #include<iostream> #in ...

随机推荐

  1. jquery值ajaxForm

    参考 http://www.360doc.com/content/13/1001/17/1542811_318406421.shtml

  2. SOA,ESB 与 SCA

    SOA,ESB与 SCA SOA 与 ESB SOA(Service Oriented Architecture),面向服务体系结构,是一种组件模型架构,一种支撑软件运行的相对稳定的结构.其本质是一种 ...

  3. Oracle OEM建库实例

    OEM是一个图形化的数据库管理员工具.它为数据库管理员提供了一个集中的系统管理工具,同时 它也是一个用来管理.诊断和调试多个数据库的工具,一个用来管理来自多个地点的多个网络节点和服务的工具.该工具可以 ...

  4. iOS 获取URL中的参数

    - (NSString *)getParamByName:(NSString *)name URLString:(NSString *)url { NSError *error; NSString * ...

  5. 怎样在win7上远程连接linux系统

    window操作系统的电脑 一台安装了linux系统的服务器 putty.exe小软件 方法/步骤   在前面的环境和软件都有的情况下,双击putty.exe软件,如下图:   在软件界面中的:Hos ...

  6. ios专题 - sandbox机制

    [原创]http://www.cnblogs.com/luoguoqiang1985 ios在安装APP时,把APP的偏好设置与数据放在sandbox里.sandbox通过一系列细颗粒度控制APP访问 ...

  7. DateTimePicker时间控件:

    DateTimePicker时间控件: http://xdsoft.net/jqplugins/datetimepicker/ 可以参考文档设置各种属性,格式. 用法: 首先下载datetimepic ...

  8. thinkphp中表有前缀名的时候申明模板的方法

    $Model=new \Home\Model\Stu_activityModel; $Model=D('Stu_activity');//错误的声明不了

  9. EFBaseDal新增删除方法

    public T Delete(int id )        {            var entity = db.Set<T>().Find(id);            T t ...

  10. MAC OX 配置JDK环境变量

    大家在windows里面配置JDK环境变量很容易,但是如果要在mac里面配置JDK环境变量和windows里面有所不同,具体如下: 第一: mac OS里面自带jdk,不过是1.6的版本,现在很多人使 ...