题目描述
知识点
动态规划
结果
实现
码前思考
- 采用的是一种比较暴力的手法,首先做的是计算上面,左边最长的1.然后逐个的去判断正方形(采用包裹的方法!)
代码实现
//有点意思的dp
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
//首先分别记录每个结点上面和左边邻接的1的数量
int height = matrix.size();
if(height==0){
return 0;
}
int width = matrix[0].size();
vector<vector<int>> up(height,vector<int>(width,0));
vector<vector<int>> left(height,vector<int>(width,0));
for(int i=0;i<height;i++){
for(int j=0;j<width;j++){
//cout<<up[i][j]<<" ";
if(matrix[i][j]=='1'){
//首先无脑初始化
up[i][j]=1;
left[i][j]=1;
if(i-1>=0 && matrix[i-1][j]=='1'){
up[i][j]=up[i-1][j]+1;
}
if(j-1>=0 && matrix[i][j-1]=='1'){
left[i][j]=left[i][j-1]+1;
}
}
}
}
int maxV=0;
//接下来依然是遍历,是求最大边长惹
for(int i=0;i<height;i++){
for(int j=0;j<width;j++){
if(matrix[i][j]=='1'){
//得到最可能的最大边长
int maxLen = min(up[i][j],left[i][j]);
int k=1;
for(;k<maxLen;k++){
if(left[i-k][j]>=k+1&&up[i][j-k]>=k+1){
continue;
}else{
break;
}
}
//这里的i就是最大的那个边长
maxV = max(maxV,k);
}
}
}
return maxV*maxV;
}
};