洛谷 [P1169] [ZJOI2007] 最大的正方形
本题是一道求最大子矩阵的题,可以使用悬线法来做,因为是相邻的01矩阵,所以需要对悬线法进行改动。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <cmath>
using namespace std;
const int MAXN=2005;
int init(){
int rv=0,fh=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') fh=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
rv=(rv<<1)+(rv<<3)+c-'0';
c=getchar();
}
return fh*rv;
}
bool ff[MAXN][MAXN];
int m,n,ans1,ans2,H[MAXN][MAXN],L[MAXN][MAXN],R[MAXN][MAXN],l[MAXN][MAXN],r[MAXN][MAXN];
int main(){
freopen("in.txt","r",stdin);
n=init();m=init();
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
ff[i][j]=init();
}
}
for(int i=1;i<=n;i++){
l[i][1]=0;
for(int j=2;j<=m;j++){
if(ff[i][j]!=ff[i][j-1]){
l[i][j]=l[i][j-1];
}else{
l[i][j]=j-1;
}
}
r[i][m]=m+1;
for(int j=m-1;j>=1;j--){
if(ff[i][j]!=ff[i][j+1]){
r[i][j]=r[i][j+1];
}else r[i][j]=j+1;
}
}
for(int i=1;i<=m;i++){
H[1][i]=1;L[1][i]=l[1][i];R[1][i]=r[1][i];
}
for(int i=2;i<=n;i++){
for(int j=1;j<=m;j++){
if(ff[i][j]!=ff[i-1][j]){
H[i][j]=H[i-1][j]+1;
L[i][j]=max(l[i][j],L[i-1][j]);R[i][j]=min(r[i][j],R[i-1][j]);
}else{
H[i][j]=1;
L[i][j]=l[i][j];R[i][j]=r[i][j];
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
int len=min(H[i][j],R[i][j]-L[i][j]-1);
ans1=max(ans1,len*len);
ans2=max(ans2,H[i][j]*(R[i][j]-L[i][j]-1));
}
}
cout<<ans1<<endl<<ans2<<endl;
fclose(stdin);
return 0;
}
方法2:对于输入的时候进行预处理,将横纵坐标和为偶数的点取反,a[i][j] ^= (i ^ j) & 1,问题就化为了求最大的01子矩阵的问题。
方法三:单调栈/并查集
洛谷 [P1169] [ZJOI2007] 最大的正方形的更多相关文章
- 洛谷 P1169 [ZJOI2007]棋盘制作
2016-05-31 14:56:17 题目链接: 洛谷 P1169 [ZJOI2007]棋盘制作 题目大意: 给定一块矩形,求出满足棋盘式黑白间隔的最大矩形大小和最大正方形大小 解法: 神犇王知昆的 ...
- 【题解】洛谷P1169 [ZJOI2007] 棋盘制作(坐标DP+悬线法)
次元传送门:洛谷P1169 思路 浙江省选果然不一般 用到一个从来没有听过的算法 悬线法: 所谓悬线法 就是用一条线(长度任意)在矩阵中判断这条线能到达的最左边和最右边及这条线的长度 即可得到这个矩阵 ...
- 洛谷 P1169 [ZJOI2007]棋盘制作 (悬线法)
和玉蟾宫很像,条件改成不相等就行了. 悬线法题目 洛谷 P1169 p4147 p2701 p1387 #include<cstdio> #include<algorithm& ...
- 洛谷P1169 [ZJOI2007]棋盘制作 悬线法 动态规划
P1169 [ZJOI2007]棋盘制作 (逼着自己做DP 题意: 给定一个包含0,1的矩阵,求出一个面积最大的正方形矩阵和长方形矩阵,要求矩阵中相邻两个的值不同. 思路: 悬线法. 用途: 解决给定 ...
- [洛谷P1169] [ZJOI2007] 棋盘制作 解题报告(悬线法+最大正方形)
题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个 8×8 大小的黑白相间的方阵,对应八八六十四卦,黑白对应阴阳. 而我 ...
- 洛谷P1169[ZJOI2007]棋盘制作
题目 一道悬线法的裸题,悬线法主要是可以处理最大子矩阵的问题. 而这道题就是比较经典的可以用悬线法来处理的题. 而悬线法其实就是把矩阵中对应的每个位置上的元素分别向左向上向右,寻找到不能到达的地方,然 ...
- 洛谷 P1169||bzoj1057 [ZJOI2007]棋盘制作
洛谷P1169 bzoj1057 这个题目跟最大全0子矩阵是类似的.正方形的话,只要把任意极大子正方形(”极大“定义见后面的”论文“)当成把某个极大子矩形去掉一块变成正方形即可,容易解决. 解法1:看 ...
- BZOJ1047或洛谷2216 [HAOI2007]理想的正方形
BZOJ原题链接 洛谷原题链接 显然可以用数据结构或\(ST\)表或单调队列来维护最值. 这里采用单调队列来维护. 先用单调队列维护每一行的最大值和最小值,区间长为正方形长度. 再用单调队列维护之前维 ...
- BZOJ1058或洛谷1110 [ZJOI2007]报表统计
BZOJ原题链接 洛谷原题链接 STL 本题可以直接使用\(\mathtt{STL\ multiset}\)水过去. 因为本题插入数的操作实际上就是将原数列分为\(n\)段,在每一段的末尾插入数,所以 ...
随机推荐
- hadoop2.6.0集群搭建
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- jquery dataTimePicker日历插件(精确到小时)
效果图: 下载地址:https://github.com/WangChangyao/jquery-dataTimePicker.git <!DOCTYPE html> <h ...
- Anaconda更新和第三方包更新
更新Anaconda和它所包含的包 1.打开cmd,切换到Anaconda的Scripts目录下:./Anaconda3/Scripts 2.更新Anaconda conda update conda ...
- 关于STM32驱动DS1302实时时钟的一点思考
之前用51驱动过DS1302,没用多久就输出了正确的时间.当时以为这块芯片其实没啥,很简单.但是现在用STM32做项目,用到同样的芯片,以为这有何难,只要把那个程序拿过来复制黏贴改一下IO设置不就行了 ...
- 解决无限 This file is indented with tabs instead of 4 spaces
File -> Settings -> Editor -> Code Style -> Java -> Tabs and Indents -> Use tab ch ...
- dede织梦栏目页和文章页中获取当前栏目名称方法
一般情况下,在dede织梦系统中列表页.栏目页和文章页中获取当前所在栏目名称只需要代码:{dede:type}[field:typename]{/dede:type}即可,不需要定义ID,默认的就是当 ...
- two Pass方法连通域检测
原理: Two-Pass方法检测连通域的原理可参见这篇博客:http://blog.csdn.net/lichengyu/article/details/13986521. 参考下面动图,一目了然. ...
- Codeforces 900 E. Maximum Questions (DP,技巧)
题目链接:900 E. Maximum Questions 题意: 给出一个长度为n只含有a和b还有'?'的串s,且'?'可以被任意替换为a或b.再给出一个字符串t (奇数位上为a,偶数位上为b,所以 ...
- log4j:ERROR Category option " 1 " not a decimal integer.错误解决
log4j.properties 的配置文件中: log4j.appender.stdout.layout.ConversionPattern = %d{ABSOLUTE} %5p %c{ 1 }: ...
- c# winform 类似android toast消息功能
先看下效果: 支持动画,支持声音,支持定时自动关闭 使用方法: var notifycation = new Notification("My Notification", &qu ...