c++解决在一个二维01矩阵中找到全为1的最大正方形,返回其面积。
作者:野牛程序员:2023-12-04 21:51:32 C++阅读 2714
c++解决在一个二维01矩阵中找到全为1的最大正方形,返回其面积。 样例 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 返回4
该问题可以使用动态规划来解决。我们可以定义一个二维数组 dp
,其中 dp[i][j]
表示以矩阵中第 i
行和第 j
列为右下角的正方形的最大边长。
动态规划的状态转移方程如下:
如果 matrix[i][j]
为 0,那么 dp[i][j]
必然为 0,因为以 matrix[i][j]
为右下角的正方形不存在。
如果 matrix[i][j]
为 1,那么 dp[i][j]
的值由其上方、左方和左上方的三个相邻位置的 dp
值决定。具体而言,dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1
。
遍历整个矩阵,更新 dp
数组的同时,记录最大边长。最终返回最大边长的平方即为最大正方形的面积。
#include <iostream> #include <vector> #include <algorithm> using namespace std; int maximalSquare(vector<vector<int>>& matrix) { if (matrix.empty() || matrix[0].empty()) { return 0; } int m = matrix.size(); int n = matrix[0].size(); int maxSide = 0; vector<vector<int>> dp(m, vector<int>(n, 0)); for (int i = 0; i < m; ++i) { for (int j = 0; j < n; ++j) { if (matrix[i][j] == 1) { if (i == 0 || j == 0) { dp[i][j] = 1; } else { dp[i][j] = min({dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]}) + 1; } maxSide = max(maxSide, dp[i][j]); } } } return maxSide * maxSide; } int main() { vector<vector<int>> matrix = { {1, 0, 1, 0, 0}, {1, 1, 1, 1, 1}, {1, 1, 1, 1, 1}, {1, 0, 1, 0, 1}, {1, 0, 1, 0, 0} }; cout << maximalSquare(matrix) << endl; return 0; }
野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
- 上一篇:python如何将输入转换成列表
- 下一篇:常见的HTTP状态码