查找最大的方形子矩阵

时间:2019-05-09 13:55:59

标签: c# math matrix submatrix

我正在尝试从可以包含不同数字的矩阵中找到具有相同数字的最大正方形子矩阵

我找到了一些与这个问题似乎相同的答案,但没有任何关于方形子矩阵的

    int[,] dp = new int[a.GetLength(0), a.GetLength(1)];
    for (int i = 0; i < a.GetLength(0); i++)
    {
        for (int j = 0; j < a.GetLength(1); j++)
        {
            if (i == 0 || j == 0)
                dp[i, j] = 1;
            else
            {
                if (a[i, j] == a[i - 1, j] &&
                    a[i, j] == a[i, j - 1] &&
                    a[i, j] == a[i - 1, j - 1])
                {
                    dp[i, j] = (dp[i - 1, j] > dp[i, j - 1] &&
                                dp[i - 1, j] > dp[i - 1, j - 1] + 1) ?
                                                        dp[i - 1, j] :
                                (dp[i, j - 1] > dp[i - 1, j] &&
                                 dp[i, j - 1] > dp[i - 1, j - 1] + 1) ?
                                                         dp[i, j - 1] :
                                                  dp[i - 1, j - 1] + 1;
                }
                else dp[i, j] = 1;
            }
        }
    }

               {{7, 4, 7, 7, 7, 7},
                {7, 4, 7, 7, 7, 7},
                {7, 7, 1, 7, 7, 7},
                {7, 7, 3, 7, 9, 7},
                {1, 1, 7, 7, 1, 7},
                {7, 7, 7, 5, 7, 7}}; I expect to get the top right 3x3 submatrix containing 7's

1 个答案:

答案 0 :(得分:0)

您的算法几乎可以正常工作,仅当先前数字的值相等时才应更改条件。

    dp[i, j] = Math.Min(Math.Min(dp[i - 1, j], dp[i, j - 1]), dp[i - 1, j - 1]) + 1;

这样,您将获得下一个解决方案:

1,1,1,1,1,1
1,1,1,2,2,2
1,1,1,1,2,3
1,2,1,1,1,1
1,1,1,1,1,1
1,1,1,1,1,1

每个数字表示是否有一个子矩阵,带有从前到左的前一个数字。因此,最大的子矩阵是带有3的子矩阵,从(0,4)位置开始到(2,6)结束。