[洛谷1681]最大正方形II

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

 1 #include<cstdio>
 2 #include<cctype>
 3 #include<algorithm>
 4 inline int getint() {
 5     char ch;
 6     while(!isdigit(ch=getchar()));
 7     int x=ch^‘0‘;
 8     while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^‘0‘);
 9     return x;
10 }
11 const int inf=0x7ffffffe;
12 int main() {
13     int n=getint(),m=getint();
14     bool a[2][m+1];
15     int up[2][m+1],left[2][m+1],f[2][m+1];
16     f[1][0]=inf;
17     for(register int i=0;i<=m;i++) f[0][i]=inf;
18     int ans=0;
19     for(register int i=1;i<=n;i++) {
20         for(register int j=1;j<=m;j++) {
21             a[i&1][j]=getint();
22             up[i&1][j]=(i==1||a[i&1][j]==a[!(i&1)][j])?1:(up[!(i&1)][j]+1);
23             left[i&1][j]=(j==1||a[i&1][j]==a[i&1][j-1])?1:(left[i&1][j-1]+1);
24             f[i&1][j]=std::min(f[!(i&1)][j-1]+1,std::min(up[i&1][j],left[i&1][j]));
25             ans=std::max(ans,f[i&1][j]);
26         }
27     }
28     printf("%d\n",ans);
29     return 0;
30 }
时间: 2024-10-07 00:34:10

[洛谷1681]最大正方形II的相关文章

洛谷P1681 最大正方形II

P1681 最大正方形II 题目背景 忙完了学校的事,v神终于可以做他的“正事”:陪女朋友散步.一天,他和女朋友走着走着,不知不觉就来到 了一个千里无烟的地方.v神正要往回走,如发现了一块牌子,牌子上有有一行小字和一张图,小字说道:“找到图上最大的交错正方形之后和我联系,这块地就是 你的了.”在房价疯长的年代,v神当然不愿错过这个机会,于是开始找了起来……以v神的能力当然找不出来了,你能帮v神找出来吗? 题目描述 图上有一个矩阵,由N*M个格子组成,这些格子由两种颜色构成,黑色和白色.请找到面积

洛谷 P1387 最大正方形

P1387 最大正方形 题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=100),接下来n行,每行m个数字,用空格隔开,0或1. 输出格式: 一个整数,最大正方形的边长 输入输出样例 输入样例#1: 4 4 0 1 1 1 1 1 1 0 0 1 1 0 1 1 0 1 输出样例#1: 2吐槽:(⊙o⊙)…,洛谷的双倍经验真多. #include<iostream> #i

洛谷 P1387 最大正方形 Label:奇怪的解法

题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=100),接下来n行,每行m个数字,用空格隔开,0或1. 输出格式: 一个整数,最大正方形的边长 输入输出样例 输入样例#1: 4 4 0 1 1 1 1 1 1 0 0 1 1 0 1 1 0 1 输出样例#1: 2 解法1 提供一种很简单的思路.要验证(i,j)能表示多大的正方形的末尾,就要验证(i-1,j)(i,j-1)(i-1,

洛谷P1387 最大正方形

题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=100),接下来n行,每行m个数字,用空格隔开,0或1. 输出格式: 一个整数,最大正方形的边长 输入输出样例 输入样例#1: 4 4 0 1 1 1 1 1 1 0 0 1 1 0 1 1 0 1 输出样例#1: 2 DP可解. 然而我选择了单调栈.栈里维护当前层可以向上延伸的高度,以及延伸的长度.min(长度,高度)即为当前最大边长

[洛谷1387]最大正方形

题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=100),接下来n行,每行m个数字,用空格隔开,0或1. 输出格式: 一个整数,最大正方形的边长 输入输出样例 输入样例#1: 4 4 0 1 1 1 1 1 1 0 0 1 1 0 1 1 0 1 输出样例#1: 2 思路 DP,f[i,j]表示以i,j为最右边最下边点的正方形大小. f[i,j]:=min(min(f[i-1,j],

洛谷 P1387 最大正方形 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=1387 题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=100),接下来n行,每行m个数字,用空格隔开,0或1. 输出格式: 一个整数,最大正方形的边长 输入输出样例 输入样例#1: 4 4 0 1 1 1 1 1 1 0 0

【动态规划】最大正方形 (洛谷 P1387 最大正方形)

输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=100),接下来n行,每行m个数字,用空格隔开,0或1. 输出格式: 一个整数,最大正方形的边长. 输入输出样例 输入样例: 4 4 0 1 1 1 1 1 1 0 0 1 1 0 1 1 0 1 输出样例: 2 思路 设fi,j是以(i,j)为右下角的正方形的边长. 简单分析,fi,j应满足fi,j = min( fi-1,j , fi-1,j-1 , fi,j-1 )+1; 这个比较抽象,设以(i,j)为右下角的正方形存在,边长为

【数论】洛谷P1414又是毕业季II

题目背景 "叮铃铃铃",随着高考最后一科结考铃声的敲响,三年青春时光顿时凝固于此刻.毕业的欣喜怎敌那离别的不舍,憧憬着未来仍毋忘逝去的歌.1000多个日夜的欢笑和泪水,全凝聚在毕业晚会上,相信,这一定是一生最难忘的时刻! 题目描述 彩排了一次,老师不太满意.当然啦,取每位同学的号数来找最大公约数显然不太合理.于是老师给每位同学评了一个能力值.于是现在问题变为,从n个学生中挑出k个人使得他们的默契程度(即能力值的最大公约数)最大.但因为节目太多了,而且每个节目需要的人数又不知道.老师想要

洛谷1414 又是毕业季II

题目背景 “叮铃铃铃”,随着高考最后一科结考铃声的敲响,三年青春时光顿时凝固于此刻.毕业的欣喜怎敌那离别的不舍,憧憬着未来仍毋忘逝去的歌.1000多个日夜的欢笑和泪水,全凝聚在毕业晚会上,相信,这一定是一生最难忘的时刻! 题目描述 彩排了一次,老师不太满意.当然啦,取每位同学的号数来找最大公约数显然不太合理.于是老师给每位同学评了一个能力值.于是现在问题变为,从n个学生中挑出k个人使得他们的默契程度(即能力值的最大公约数)最大.但因为节目太多了,而且每个节目需要的人数又不知道.老师想要知道所有情