动态规划
dp[i][j]表示以点(i-1,j-1)为右下角的最大正方形的边长。
当点(i-1,j-1)为1时,dp[i][j]=min(dp[i-1][j-1],dp[i][j-1],dp[i-1][j])+1
当点(i-1,j-1)为0时,dp[i][j]=0
以例题为例:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
其dp表为
int maximalSquare(vector<vector<char>>& matrix) {
if(matrix.empty() || matrix[0].empty())
return 0;
int row = matrix.size();
int col = matrix[0].size();
int maxval=0;
vector<vector<int>> dp(row+1,vector<int>(col+1));
for(int i=0;i<=row;++i){
for(int j=0;j<=col;++j){
if(i==0||j==0)
dp[i][j]=0;
else{
if(matrix[i-1][j-1]=='1'){
dp[i][j]=min(dp[i-1][j-1],min(dp[i][j-1],dp[i-1][j]))+1;
if(dp[i][j]>maxval){
maxval=dp[i][j];
}
}
else{
dp[i][j]=0;
}
}
}
}
return maxval*maxval;
}
测试函数
int main()
{
vector<vector<char>> w{ {'1','0','1','0','1'},
{'1','0','1','1','1'},
{'1','1','1','1','1'},
{'1','0','0','1','0'} };
cout << maximalSquare(w) << endl;
return 0;
}