LeetCode 221. 最大正方形(经典入门DP题)

最大正方形
d p [ i ] [ j ] dp[i][j] 代表以 i j (i,j) 为右下角能够构成的最大正方形的边长。
DP方程:
d p [ i ] [ j ] = m a x ( d [ i 1 ] [ j 1 ] , d p [ i 1 ] [ j ] , d p [ i ] [ j 1 ] ) + 1 dp[i][j] = max(d[i-1][j-1],dp[i-1][j],dp[i][j-1])+1

在这里插入图片描述

class Solution {
public:
    int maximalSquare(vector<vector<char>>& a) {
        if(a.size()==0 || a[0].size()==0) return 0;
        int m = a.size(), n = a[0].size(),ans = 0;
        vector<vector<int>> dp(m+1,vector<int>(n+1,0));
        for(int i=1;i<=m;i++){
            for(int j=1;j<=n;j++){
                if(a[i-1][j-1]=='0'){
                    dp[i][j] = 0;
                }else{
                    int s1 = dp[i-1][j-1];
                    int s2 = dp[i-1][j];
                    int s3 = dp[i][j-1];
                    dp[i][j] = min(min(s1,s2),s3)+1;
                }
                ans = max(ans,dp[i][j]*dp[i][j]);
            }
        }
        // for(int i=1;i<=m;i++){
        //     for(int j=1;j<=n;j++){
        //         cout<<dp[i][j]<<"  ";
        //     }
        //     cout<<endl;
        // }
        return ans;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_44846324/article/details/107503289