题目背景

忙完了学校的事,v神终于可以做他的“正事”:陪女朋友散步。一天,他和女朋友走着走着,不知不觉就来到了一个千里无烟的地方。v神正要往回走,如发现了一块牌子,牌子上有有一行小字和一张图,小字说道:“找到图上最大的交错正方形之后和我联系,这块地就是你的了。”在房价疯长的年代,v神当然不愿错过这个机会,于是开始找了起来……以v神的能力当然找不出来了,你能帮v神找出来吗?

题目描述

图上有一个矩阵,由N*M个格子组成,这些格子由两种颜色构成,黑色和白色。请找到面积最大的且内部是黑白交错(即两个相连的正方形颜色不能相同)的正方形。

输入格式:

第一行两个整数N和M,分别表示行数和列数。接下来有N行,每行M个数,0或1分别表示这个格子是黑色或白色。

输出格式:

仅有一行,表示满足条件最大正方形的 边长

样例

INPUT

3 3

0 1 0

1 0 0

1 1 1

OUTPUT

2

HINT

样例解释:

(1,1)到(2,2)这个正方形是满足条件的,它的边长是2

数据范围约定:

对于30%的数据,\(N\leq20\)

对于60%的数据,\(N\leq300\)

对于100%的数据,\(N\leq1500\)

SOLUTION

题解:dp

一看数据范围就知道是\(O(n^2)\)的算法,再说了这题如果要暴力的话最暴力的可以达到\(O(n^6)\)之高。(有没有其他暴力我不知道qwq)

所以考虑通过题目的性质进行优化。

根据题意,正方形的合法与否在于相邻格子之间关系的合法与否。所以我们可以先处理左右之间关系,在处理上下之间的关系。这里就可以用\(lft[i][j],rgt[i][j]\)数组在同一层扫一遍时维护一下第\(i\)行\(j\)个格子最左/右可以延伸到哪一格,这里注意一下维护顺序,\(lft[][]\)数组是从左到右,而\(rgt[][]\)是从右到左。

然后处理上下层之间的关系就可以直接进行层与层之间的转移了

\[lft[i][j]=max(lft[i][j],lft[i-1][j])
\]

\[rgt[i][j]=min(rgt[i][j],rgt[i-1][j])
\]

\[hgt[i][j]=hgt[i-1][j]+1
\]

这个\(hgt\)指的是高度(纵向长度)

然后维护过程中顺带记录一下最大值就可以了

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
const int N=1510;
int n,m,hgt[N][N],sq[N][N],lft[N][N],rgt[N][N];
int main(){
int i,j;
scanf("%d%d",&n,&m);
for (i=1;i<=n;++i)
for (j=1;j<=m;++j){
scanf("%d",&sq[i][j]);
lft[i][j]=j;rgt[i][j]=j;hgt[i][j]=1;
}
for (i=1;i<=n;++i)
for (j=2;j<=m;++j)
if (sq[i][j]^sq[i][j-1]) lft[i][j]=lft[i][j-1];
for (i=1;i<=n;++i)
for (j=m-1;j>=1;--j)
if (sq[i][j]^sq[i][j+1]) rgt[i][j]=rgt[i][j+1];
int ans=0;
for (i=1;i<=n;++i)
for (j=2;j<=m;++j){
if (i>1&&(sq[i][j]^sq[i-1][j])){
lft[i][j]=max(lft[i][j],lft[i-1][j]);
rgt[i][j]=min(rgt[i][j],rgt[i-1][j]);
hgt[i][j]=hgt[i-1][j]+1;
}
int a=min(rgt[i][j]-lft[i][j]+1,hgt[i][j]);
ans=max(ans,a);
}
printf("%d\n",ans);
return 0;
}

Luogu1681_ 最大正方形II的更多相关文章

  1. 洛谷P1681 最大正方形II

    P1681 最大正方形II 题目背景 忙完了学校的事,v神终于可以做他的“正事”:陪女朋友散步.一天,他和女朋友走着走着,不知不觉就来到 了一个千里无烟的地方.v神正要往回走,如发现了一块牌子,牌子上 ...

  2. [洛谷1681]最大正方形II

    思路:对于矩阵中的每一个元素,处理出它能扩展到的上边界$up$.左边界$left$,DP得出以该元素为右下角的最大正方形.状态转移方程:$f_{i,j}=min(f_{i-1,j-1},up_{i,j ...

  3. P1681 最大正方形II (动态规划)

    题目背景 忙完了学校的事,v神终于可以做他的"正事":陪女朋友散步.一天,他和女朋友走着走着,不知不觉就来到了一个千里无烟的地方.v神正要往回走,如发现了一块牌子,牌子上有有一行小 ...

  4. [ZJOI2007]棋盘制作 (单调栈,动态规划)

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

  5. 【DP入门到入土】

    DP例题较多,可以根据自己需求食用~ update:下翻有状压DP入门讲解,也只有讲解了(逃~ DP的实质,就是状态的枚举. 一般用DP解决的问题,都是求计数或最优问题,所以这类问题,我们也可以用搜索 ...

  6. P1681 最大正方形 Iand II

    题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=100),接下来n行,每行m ...

  7. HDU 4739 求正方形个数

    九野的博客,转载请注明出处:http://blog.csdn.net/acmmmm/article/details/11711707 求所有可能围成的正方形,借个代码 #include <que ...

  8. matlab-霍夫变换详解(判断正方形长方形)

    霍夫变换 霍夫变换是1972年提出来的,最开始就是用来在图像中过检测直线,后来扩展能检测圆.曲线等. 直线的霍夫变换就是 把xy空间的直线 换成成 另一空间的点.就是直线和点的互换. 我们在初中数学中 ...

  9. leetcode Ch2-Dynamic Programming II

    一. Longest Valid Parentheses 方法一.一维DP class Solution { public: int longestValidParentheses(string s) ...

随机推荐

  1. PAT Advanced 1089 Insert or Merge (25) [two pointers]

    题目 According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, and ...

  2. c语言中指针和多维数组的理解

    1.复习指针和数组之间的特殊关系:不带方括号的数组名是一个指针,指向该数组的第一个元素. 2.多维数组: ][];//声明一个二维数组作为举例 a.理解方式1:可以将数组看成行和列构成,即理解成2行4 ...

  3. 独立t检验

    方差相同个数相同的独立t检验 5.某饲料厂要比较A.B两种配合饲料在养猪生产中的效果,选取12头情况相似的猪,随机分成两组,分别饲喂两种配合饲料,其60天增重(单位:kg)见下表. 饲 料 60d增重 ...

  4. 游程编码run length code

    今天突然看到一个名词,游程编码.也叫行程编码. 简单理解就是,几个相同连续的字符,然后用数字统计表示. 举个例子: aaaabbbccc 用游程编码的表示就是4a3b3c 如果:连续字符只有一个 那么 ...

  5. 记一次修复Windows

    打开了一堆网页和应用,然后桌面不见了.. 于是很着急..就按各种快捷键..Win+R挂了.. 本来以为要reboot(机房电脑) , 然后问老师发现会格式化 然后发现Ctrl+Alt+Delete还存 ...

  6. Window Redis安装

    1.下载redis 下载地址:https://github.com/MicrosoftArchive/redis/releases ​ 2. 安装redis 把下载的Redis-x64-3.2.100 ...

  7. 描述符(\_\_get\_\_和\_\_set\_\_和\_\_delete\_\_)

    描述符(__get__和__set__和__delete__) 一.描述符 描述符是什么:描述符本质就是一个新式类,在这个新式类中,至少实现了__get__(),set(),delete()中的一个, ...

  8. look and say 外观数列的python实现

    #look_and_say 外观数列 如果我们把 1 作为Look-and-say 数列的第一项,那么,它的前几项是这样的: 1, 11, 21, 1211, 111221, 312211, 1311 ...

  9. windows下快速安装tensorflow

    下载安装文件 https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/ 配置pip参数文件 [global] index-url = https://mi ...

  10. 唐顿庄园S01E01观看感悟

    刚刚看了唐顿庄园的第一季第一集.看第一遍的时候,主要是看剧情,看看有没有什么吸引人的.我是一带而过的.等到看第二遍的时候,仔细观察画面,欣赏画面的美感,琢磨人物的台词对话.不断的倒退回放,越看越有滋味 ...