【最大正方形】

人生乱弹 2年前 (2024) admin
8 0

题目描述
在一个

n

×

m

n\times m

n×m 的只包含

0

0

0 和

1

1

1 的矩阵里找出一个不包含

0

0

0 的最大正方形,输出边长。
输入格式
输入文件第一行为两个整数

n

,

m

(

1

n

,

m

100

)

n,m(1\leq n,m\leq 100)

n,m(1≤n,m≤100),接下来

n

n

n 行,每行

m

m

m 个数字,用空格隔开,

0

0

0 或

1

1

1。
输出格式
一个整数,最大正方形的边长。
样例 #1
样例输入 #1
4 4
0 1 1 1
1 1 1 0
0 1 1 0
1 1 0 1

样例输出 #1
2

代码如下:
int main() {
int n, m;
cin >> n >> m;
vector<vector<int>> matrix(n, vector<int>(m)); // 初始化二维数组
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
cin >> matrix[i][j];
}
}
// dp[i][j]表示以matrix[i][j]为右下角的正方形的最大边长
vector<vector<int>> dp(n, vector<int>(m, 0));
int maxLen = 0;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
if (i == 0 || j == 0 || matrix[i][j] == 0) { // 边界条件,如果是第一行或者第一列,或者matrix[i][j] == 0,说明以当前位置为右下角不可能构成正方形
dp[i][j] = matrix[i][j];
}
else {
// 以matrix[i][j]为右下角的正方形的最大边长取决于左边、上边、左上边的正方形的最大边长,
// 为什么取最小值,因为只有三个边都是1,才能构成一个正方形
dp[i][j] = min(dp[i - 1][j - 1], min(dp[i][j - 1], dp[i - 1][j])) + 1;
}
maxLen = max(maxLen, dp[i][j]); // 更新最大边长
}
}
cout << maxLen << endl;
return 0;
}

文章来源

版权声明:admin 发表于 2024年4月6日 am2:42。
转载请注明:【最大正方形】 | 银库

相关文章

本站主题由 OneNav 一为主题强力驱动