• leetcode 221 最大正方形


    题目描述: 

      在一个由0和1组成的矩阵内,找到只包含1的最大正方形的最大面积。

    题解:

      考虑动态规划。用$dp(i,j)$表示以$(i,j)$为右下角,且只包含1的正方形的边长的最大值。状态可以参考(leetcode 1277),如下:

    • 如果当前位置为0,$dp(i,j) = 0$
    • 如果当前位置为1,当前状态由其左方、上方、左上方共同决定:$dp(i,j) = min(dp(i,j-1) , dp(i-1,j),dp(i-1,j-1)) + 1$

      下图给出了dp的计算过程:

      

    AC代码如下:

      

    class Solution {
    public:
        int maximalSquare(vector<vector<char>>& matrix) {
            if (matrix.size() == 0 || matrix[0].size() == 0) {
                return 0;
            }
            int maxSide = 0;
            int rows = matrix.size(), columns = matrix[0].size();
            vector<vector<int>> dp(rows, vector<int>(columns));
            for (int i = 0; i < rows; i++) {
                for (int j = 0; j < columns; j++) {
                    if (matrix[i][j] == '1') {
                        if (i == 0 || j == 0) {
                            dp[i][j] = 1;
                        } else {
                            dp[i][j] = min(min(dp[i - 1][j], dp[i][j - 1]), dp[i - 1][j - 1]) + 1;
                        }
                        maxSide = max(maxSide, dp[i][j]);
                    }
                }
            }
            int maxSquare = maxSide * maxSide;
            return maxSquare;
        }
    };
  • 相关阅读:
    MongoDB的安装与简单使用
    [SCOI2008]天平
    [ZJOI2008]树的统计
    [HEOI2015]兔子与樱花
    [HAOI2006]l旅行
    [ZJOI2008]泡泡堂BNB
    [ZJOI2007]时态同步
    [SCOI2005]栅栏
    [SCOI2008]着色方案
    [SCOI2005]互不侵犯King
  • 原文地址:https://www.cnblogs.com/z1141000271/p/12849413.html
Copyright © 2020-2023  润新知