P题1351-1399

P1387 最大正方形

题目描述

在一个 $n\times m$ 的只包含 $0$ 和 $1$ 的矩阵里找出一个不包含 $0$ 的最大正方形,输出边长。

输入格式

输入文件第一行为两个整数 $n,m(1\leq n,m\leq 100)$,接下来 $n$ 行,每行 $m$ 个数字,用空格隔开,$0$ 或 $1$。

输出格式

一个整数,最大正方形的边长。

样例 #1

样例输入 #1

4 4
0 1 1 1
1 1 1 0
0 1 1 0
1 1 0 1

样例输出 #1

2

直接暴力枚举

#include <iostream>
#include <algorithm>
using namespace std;
using ll = long long;
using ull = unsigned long long;
const ull N = 1e3 + 100;
const ull M = 1e3 + 200;
ull a[N][M];
ull prefix[N][M];
ull diff[N][M];
int main()
{
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= m; ++j)
cin >> a[i][j];
}
//预处理前缀和
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= m; ++j)
{
prefix[i][j] = prefix[i - 1][j] + prefix[i][j - 1] - prefix[i - 1][j - 1] + a[i][j];
}
}
//暴力枚举?//滑动窗口问题
int minwidows = min(n, m);
while (minwidows > 1)
{
for (int i = 1; i+minwidows-1 <= n; ++i)
{
for (int j = 1; j+minwidows-1 <= m; ++j)
{
ll tmp = prefix[i + minwidows - 1][j + minwidows - 1] - prefix[i - 1][j + minwidows - 1] - prefix[i + minwidows - 1][j - 1] + prefix[i - 1][j - 1];
if (tmp == minwidows * minwidows)
{
cout << minwidows << '\n';
return 0;
}
}
}
minwidows--;
}
cout << minwidows << '\n';
return 0;
}

或者使用dp来做

#include <iostream>
#include <vector>
#include <map>
#include <numeric>
#include <algorithm>
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
const int MAX = 1e3 + 100;
ll a[MAX][MAX];
ll dp[MAX][MAX];
ll prefix[MAX][MAX];
ll ans;
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= m; ++j)
{
cin >> a[i][j];
}
}
//dp 状态转移方程为 dp[i][j]=min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1;
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= m; ++j)
{ if (a[i][j] == 1)
{
dp[i][j] = min(min(dp[i - 1][j], dp[i][j - 1]), dp[i - 1][j - 1]) + 1;
ans = max(dp[i][j], ans);
}
}
}
cout << ans << "\n";
return 0;
}
posted @   coreSoul  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示