原题链接:https://leetcode-cn.com/problems/maximal-square/
动态规划转移式:
dp[i][j]=min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1;
代码:
int maximalSquare(vector<vector<char>>& matrix) {
if(matrix.empty()) return 0;
int m=matrix.size();
int n=matrix[0].size();
int S=0;
vector<vector<int>> dp(m,vector(n,0));
for(int i=0;i<m;i++){
if(matrix[i][0]=='1') S=1;
dp[i][0]=matrix[i][0]-'0';
}
for(int j=0;j<n;j++) {
if(matrix[0][j]=='1') S=1;
dp[0][j]=matrix[0][j]-'0';
}
for(int i=1;i<m;i++){
for(int j=1;j<n;j++){
if(matrix[i-1][j-1]=='1'&&matrix[i-1][j]=='1'&&matrix[i][j-1]=='1'&&matrix[i][j]=='1'){
dp[i][j]=2;
}
if(dp[i-1][j-1]&&dp[i-1][j]&&dp[i][j-1]&&matrix[i][j]=='1'){
dp[i][j]=min(min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1])+1;
}
S=std::max(S,matrix[i][j]-'0');
S=std::max(S,dp[i][j]*dp[i][j]);
}
}
return S;
}
但是这个代码还能再优化,比如dp数组的初始化,这里可以将数组两维都分别多设置一行,这样可以省去初始化代码了。很机智!并且我之前的代码有点混乱,其实有了min这个约束,判断条件只用判断maxtrix[i][j]=='1’即可,并且计算dp的代码也可以简化。
int maximalSquare(vector<vector<char>>& matrix) {
if(matrix.empty()) return 0;
int m=matrix.size();
int n=matrix[0].size();
int S=0;
vector<vector<int>> dp(m+1,vector(n+1,0));
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(matrix[i-1][j-1]=='1'){
dp[i][j]=min(min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1])+1;
}
S=max(S,dp[i][j]*dp[i][j]);
}
}
return S;
}
好的思路永远是最重要的!