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 0Return 4.
非常巧妙的n^2的dp, f[i][j] = min(f[i - 1][j - 1], f[i][j - 1], f[i][j - 1]) + 1
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
int n, m, ret = 0;
if(((n = matrix.size()) == 0) || ((m = matrix[0].size()) == 0))
return 0;
int **f = new int*[n];
for(int i = 0; i < n; ++i)
f[i] = new int[m];
for(int i = 0; i < n; ++i)
for(int j = 0; j < m; ++j)
f[i][j] = 0;
for(int i = 0; i < m; ++i)
if(matrix[0][i] == '1'){
f[0][i] = 1;
ret = 1;
}
for(int i = 1; i < n; ++i)
if(matrix[i][0] == '1'){
f[i][0] = 1;
ret = 1;
}
for(int i = 1; i < n; ++i)
for(int j = 1; j < m; ++j)
if(matrix[i][j] == '1'){
f[i][j] = min(min(f[i - 1][j], f[i][j - 1]), f[i - 1][j - 1]) + 1;
ret = max(ret, f[i][j]);
}
for(int i = 0; i < n; ++i)
delete f[i];
return ret * ret;
}
};