题目描述
思路分析
线性dp
f
[
i
]
[
j
]
:
以
(
i
,
j
)
为
右
下
角
的
全
1
正
方
形
的
最
大
边
长
f[i][j]:以(i,j)为右下角的全1正方形的最大边长
f[i][j]:以(i,j)为右下角的全1正方形的最大边长
f
[
i
]
[
j
]
=
m
i
n
(
f
[
i
]
[
j
−
1
]
,
f
[
i
−
1
]
[
j
]
,
f
[
i
−
1
]
[
j
−
1
]
)
+
1
f[i][j]=min(f[i][j-1],f[i-1][j],f[i-1][j-1])+1
f[i][j]=min(f[i][j−1],f[i−1][j],f[i−1][j−1])+1
证明用反证法+画图
代码实现
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
if(!matrix.size()||!matrix[0].size()) return 0;
int n=matrix.size(),m=matrix[0].size();
vector<vector<int>> f(n+1,vector<int>(m+1));
int res=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
if(matrix[i-1][j-1]=='1'){
f[i][j]=min(f[i-1][j],min(f[i][j-1],f[i-1][j-1]))+1;
res=max(f[i][j],res);
}
}
return res*res;
}
};