标签:
这题使用动态规划,基本想法是建立一张表table,table[i][j]就标志以点(i, j) 为右下角顶点的正方形最大边长,显然,可以通过table[i - 1][j - 1]来得到
table[i][j]的值(正方形,只需要考虑对角的方向)。
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
int M = matrix.size();
if(M == 0)
return 0;
int N = matrix[0].size();
if (N == 0)
return 0;
vector<vector<int>> table(M);
for(int i = 0; i < M; i++)
table[i].resize(N);
int maxLen = 0;
for(int j = 0; j < N; j++){
if(matrix[0][j] == ‘0‘)
table[0][j] = 0;
else
table[0][j]= 1;
maxLen = max(table[0][j], maxLen);
}
for(int i = 0; i < M; i++){
if(matrix[i][0] == ‘0‘){
table[i][0]= 0;
}
else{
table[i][0]= 1;
}
maxLen = max(table[i][0], maxLen);
}
for(int i = 1; i < M; i++){
for(int j = 1; j < N; j++){
if(matrix[i][j] == ‘1‘) {
int w = 1;
int h = 1;
for (int k = 0; k < table[i - 1][j - 1]; k++) {
//for all k in line i
if(matrix[i][j - 1 - k] == ‘1‘)
w++;
else
break;
}
for (int k = 0; k < table[i - 1][j - 1]; k++) {
// for all k in col j
if(matrix[i - 1 - k][j] == ‘1‘)
h++;
else
break;
}
table[i][j] = min(w, h);
}
else{
table[i][j] = 0;
}
maxLen = max(table[i][j], maxLen);
}
}
return maxLen * maxLen;
}
};
标签:
原文地址:http://www.cnblogs.com/hustxujinkang/p/4712503.html