在 C++ 中查找所有元素都相等的最大方子矩阵

c++server side programmingprogramming更新于 2025/3/15 11:07:17

在此问题中,我们给定一个 N*N 矩阵 mat[]。我们的任务是找到所有元素都相等的最大方阵

在这个问题中,我们需要从给定的矩阵中找出所有元素都相同的子矩阵的最大大小。

让我们举一个例子来理解这个问题,

输入:mat[][] = {{1, 2, 1}, {1, 2, 2}, {2, 2, 2}}
输出:2

解释

矩阵 a11、a12、a21、a22 的大小为 2X2,并形成一个所有元素都相等的子矩阵。

解决方法

该问题的一个简单解决方案是遍历矩阵的所有元素,然后检查所有具有相同元素的子矩阵。该算法的时间复杂度为 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<<"所有元素相等的最大方阵子矩阵为 "<<findmaxSqMatSize(mat);
    return 0;
}

输出

所有元素相等的最大方阵子矩阵为 2

相关文章