洛谷 P1387 最大正方形 题解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷 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 1 1 0
1 1 0 1
输出样例#1:
2

分析:
看到有国家集训队的神犇研究过这个问题,做法是悬线法。
不过这题可以直接DP,而且做法非常简便qwq
出自某dalao的博客。取min保证组出正方形,画一画图大概就能想通。


AC代码:
 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<iostream>
 4 
 5 const int MAXN = 105;
 6 
 7 inline void read(int &x)
 8 {
 9     char ch = getchar(),c = ch;x = 0;
10     while(ch < 0 || ch > 9) c = ch,ch = getchar();
11     while(ch <= 9 && ch >= 0) x = (x<<1)+(x<<3)+ch-0,ch = getchar();
12     if(c == -) x = -x;
13 }
14 
15 inline int min(int a,int b)
16 {return a<b?a:b;}
17 
18 int n,m,ans,mp[MAXN][MAXN],f[MAXN][MAXN];
19 
20 int main()
21 {
22     read(n),read(m);
23     for(int i = 1;i <= n;++ i)
24         for(int j = 1;j <= m;++ j)
25         {
26             read(mp[i][j]);
27             if(mp[i][j]) f[i][j] = min(f[i-1][j-1],min(f[i-1][j],f[i][j-1]))+1;
28             if(f[i][j] > ans) ans = f[i][j];
29         }
30     printf("%d\n",ans);
31     return 0;
32 }

 

以上是关于洛谷 P1387 最大正方形 题解的主要内容,如果未能解决你的问题,请参考以下文章

洛谷P1387 最大正方形

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

CCF CSP-2021-04 赛题练习

洛谷 [P2701] 巨大的牛棚

P1387 最大正方形

P1387 最大正方形