在 C++ 中查找所有元素都相等的最大正方形子矩阵
在这个问题中,我们给定一个 N*N 矩阵 mat[]。我们的任务是查找所有元素都相等的最大的正方形子矩阵。
在这个问题中,我们需要从给定的矩阵中找到所有元素都相同的最大子矩阵的大小。
让我们举个例子来理解这个问题,
Input: mat[][] = {{1, 2, 1}, {1, 2, 2}, {2, 2, 2}} Output: 2
解释 -
matrix a11, a12, a21, a22 is of size 2X2 and forms a sub-matrix with all equal elements.
解决方案方法
解决该问题的一个简单方法是遍历矩阵的所有元素,然后检查所有具有相同元素的子矩阵。算法的时间复杂度为 O(n3),每个子矩阵的创建时间复杂度为 O(n2)。
另一种解决该问题的方法是使用动态规划,其中我们将存储每个位置之前所有元素都相同的最大子矩阵的大小。为此,我们将考虑相邻元素,然后考虑满足给定条件的最长矩阵。让我们制定 DP 矩阵的任何单元格的宽度。
如果所有元素的邻居都相同,我们将增加最长子矩阵的值。在这种情况下,
$DP[i][j]\: =\: min(DP[i-1][j] , DP[i][j-1], DP[i-1][j-1]) + 1$
如果不是这种情况,
DP[i][j] = 1
示例
程序说明我们解决方案的工作原理
#include<bits/stdc++.h> #define n 4 #define m 4 using namespace std; int findmaxSqMatSize(int mat[][m]){ int DP[n][m]; memset(DP, sizeof(DP), 0); int maxSqMatSize = 0; for (int i = 0 ; i < n ; i++){ for (int j = 0 ; j < m ; j++){ if (i == 0 || j == 0) DP[i][j] = 1; else{ if (mat[i][j] == mat[i-1][j] && mat[i][j] == mat[i][j-1] && mat[i][j] == mat[i-1][j-1] ) DP[i][j] = min(min(DP[i-1][j], DP[i][j-1]), DP[i-1][j-1] ) + 1; else DP[i][j] = 1; } maxSqMatSize = max(maxSqMatSize, DP[i][j]); } } return maxSqMatSize; } int main(){ int mat[n][m] = { {2, 1, 4, 3}, {5, 1, 1, 7}, {1, 1, 1, 4}, {9, 4, 6, 0}}; cout<<"The maximum square sub-matrix with all equal elements is "<<findmaxSqMatSize(mat); return 0; }
输出
The maximum square sub-matrix with all equal elements is 2
广告