leetcode算法题--最大正方形

原题链接: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;
}

好的思路永远是最重要的!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章