zoukankan      html  css  js  c++  java
  • [LeetCode] Maximal Square

    Maximal Square

    Given a 2D binary matrix filled with 0's and 1's, find the largest square containing all 1's and return its area.

    For example, given the following matrix:

    1 0 1 0 0
    1 0 1 1 1
    1 1 1 1 1
    1 0 0 1 0
    

    Return 4.

    枚举就OK了,时间复杂度为O(n^3),276ms AC。

     1 class Solution {
     2 public:
     3     int getArea(vector<int> &array, int k) {
     4         if (array.size() < k) return 0;
     5         int cnt = 0;
     6         for (int i = 0; i < array.size(); ++i) {
     7             if (array[i] != k) cnt = 0;
     8             else ++cnt;
     9             if (cnt == k) return k * k;
    10         }
    11         return 0;
    12     }
    13     int maximalSquare(vector<vector<char>>& matrix) {
    14         vector<int> array;
    15         int res = 0;
    16         for (int i = 0; i < matrix.size(); ++i) {
    17             array.assign(matrix[0].size(), 0);
    18             for (int j = i; j < matrix.size(); ++j) {
    19                 for (int k = 0; k < matrix[0].size(); ++k) if (matrix[j][k] == '1') ++array[k];
    20                 res = max(res, getArea(array, j-i+1));
    21             }
    22         }
    23         return res;
    24     }
    25 };

    可以使用动态规划优化到O(n^2),下面的代码12ms AC。构造一个新的矩阵dp,dp[i][j]表示以点(i, j)为右下角的正方形的边长;状态转移方程:

    dp[i][j] = min(dp[i-1][j-1], min(dp[i-1][j], dp[i][j-1])) + 1;

    对于题目所给的例子就有:

    1 0 1 0 0
    1 0 1 1 1
    1 1 1 1 1
    1 0 0 1 0  

    转化成:

    1 0 1 0 0
    1 0 1 1 1
    1 1 1 2 1
    1 0 0 1 0  
     1 class Solution {
     2 public:
     3     int maximalSquare(vector<vector<char>>& matrix) {
     4         if (matrix.empty() || matrix[0].empty()) return 0;
     5         int M = matrix.size(), N = matrix[0].size(), res = 0;
     6         vector<vector<int>> dp(M, vector<int>(N, 0));
     7         for (int i = 0; i < M; ++i) if (matrix[i][0] == '1') {
     8             dp[i][0] = 1; res = 1;
     9         }
    10         for (int j = 0; j < N; ++j) if (matrix[0][j] == '1') {
    11             dp[0][j] = 1; res = 1;
    12         }
    13         for (int i = 1; i < M; ++i) {
    14             for (int j = 1; j < N; ++j) {
    15                 if (matrix[i][j] == '1') 
    16                     dp[i][j] = min(dp[i-1][j-1], min(dp[i-1][j], dp[i][j-1])) + 1;
    17                 res = max(res, dp[i][j]);
    18             }
    19         }
    20         return res * res;
    21     }
    22 };
  • 相关阅读:
    HDU 3681 Prison Break 越狱(状压DP,变形)
    POJ 2411 Mondriaan's Dream (状压DP,骨牌覆盖,经典)
    ZOJ 3471 Most Powerful (状压DP,经典)
    POJ 2288 Islands and Bridges (状压DP,变形)
    HDU 3001 Travelling (状压DP,3进制)
    POJ 3311 Hie with the Pie (状压DP)
    POJ 1185 炮兵阵地 (状压DP,轮廓线DP)
    FZU 2204 7
    POJ 3254 Corn Fields (状压DP,轮廓线DP)
    ZOJ 3494 BCD Code (数位DP,AC自动机)
  • 原文地址:https://www.cnblogs.com/easonliu/p/4548769.html
Copyright © 2011-2022 走看看