原題鏈接: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;
}
好的思路永遠是最重要的!