最大的以 1 为边界的正方形
记录每个点向左最多有多少个1,向上最多有多少个1,然后每个点再用
的开销去统计即可。
class Solution {
public:
int largest1BorderedSquare(vector<vector<int>>& a) {
int m = a.size(), n = a[0].size() ,ans = 0;
vector<vector<vector<int>>> dp(m+1,vector<vector<int>>(n+1,{0,0}));
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(a[i-1][j-1]==1){
dp[i][j][0] = dp[i][j-1][0]+1;
dp[i][j][1] = dp[i-1][j][1]+1;
int len = min(dp[i][j][0],dp[i][j][1]);
for(int k=1;k<=len;k++){
if(dp[i][j-k+1][1]>=k && dp[i-k+1][j][0]>=k ){
ans = max(ans,k*k);
}
}
}
}
}
return ans;
}
};