【bzoj 1057】[ZJOI2007] 棋盘制作
2016-04-22 20:20
302 查看
1057: [ZJOI2007]棋盘制作
Time Limit: 20 Sec Memory Limit: 162 MB
Submit: 2175 Solved: 1088
[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
N, M ≤ 2000
**【题解】【悬线法求最大子矩阵的第二种算法应用】
【上来便想到要将它转化为求全0或全1的子矩阵,但是没找到好方法,转换上出了问题,后来看了题解才知道要将行和列同奇或同偶的点的值取反,就可以达到目的】
【接下来就十分简单了,直接悬线法求最大子矩阵即可,至于最大子正方形在求最大子矩阵时加一步就行了,但是要注意一个重要的问题,因为经过这样转化后,全0的子矩阵和全1的子矩阵都是合法的,所以要求两遍(分别求全0的子矩阵和全1的子矩阵)】**
Time Limit: 20 Sec Memory Limit: 162 MB
Submit: 2175 Solved: 1088
[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
N, M ≤ 2000
**【题解】【悬线法求最大子矩阵的第二种算法应用】
【上来便想到要将它转化为求全0或全1的子矩阵,但是没找到好方法,转换上出了问题,后来看了题解才知道要将行和列同奇或同偶的点的值取反,就可以达到目的】
【接下来就十分简单了,直接悬线法求最大子矩阵即可,至于最大子正方形在求最大子矩阵时加一步就行了,但是要注意一个重要的问题,因为经过这样转化后,全0的子矩阵和全1的子矩阵都是合法的,所以要求两遍(分别求全0的子矩阵和全1的子矩阵)】**
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int a[2010][2010]; int h[2010],l[2010],r[2010],L,R; int n,m,ans1,ans2,b; int main() { int i,j; scanf("%d%d",&n,&m); for(i=1;i<=n;++i) for(j=1;j<=m;++j) { scanf("%d",&a[i][j]); if(((i+j)&1)==0) a[i][j]=(!a[i][j]); } for(i=1;i<=m;++i) r[i]=m; for(i=1;i<=n;++i) { L=1; R=m; for(j=1;j<=m;++j) if(a[i][j]) { L=j+1; h[j]=l[j]=0; } else { h[j]++; l[j]=max(l[j],L); } for(j=m;j>0;--j) if(a[i][j]) { R=j-1; r[j]=m; } else { int rr; r[j]=min(r[j],R); rr=min(r[j]-l[j]+1,h[j]); ans1=max(ans1,rr*rr); ans2=max(ans2,(r[j]-l[j]+1)*h[j]); } } memset(h,0,sizeof(h)); memset(l,0,sizeof(l)); memset(r,0,sizeof(r)); for(i=1;i<=m;++i) r[i]=m; for(i=1;i<=n;++i) { L=1; R=m; for(j=1;j<=m;++j) if(!a[i][j]) { L=j+1; h[j]=l[j]=0; } else { h[j]++; l[j]=max(l[j],L); } for(j=m;j>0;--j) if(!a[i][j]) { R=j-1; r[j]=m; } else { int rr; r[j]=min(r[j],R); rr=min(r[j]-l[j]+1,h[j]); ans1=max(ans1,rr*rr); ans2=max(ans2,(r[j]-l[j]+1)*h[j]); } } printf("%d\n",ans1); printf("%d\n",ans2); return 0; }
相关文章推荐
- iOSApp上架教程
- Json的JsonValueProcessor方法
- 访问控制
- poj 3070 java实现矩阵快速幂
- CI框架局部缓存
- 手机在 Android studio 中不显示logcat信息
- hdu 2686(多线程dp)
- Bestcoder Pro.ID 2012 素数判定
- LeetCode 70. Climbing Stairs
- POJ 1328 Radar Installation
- 我对Android的认识
- 大数据基础
- 大数据基础
- android学习之绑定Service并与之通信
- 进程死锁条件和银行家算法
- 构建之法3
- 【Leetcode】:318. Maximum Product of Word Lengths 问题 in JAVA
- eclipse发布web项目时提示无法找到外部包的类
- 循环节长度
- 使用iptables缓解DDOS及CC***