LeetCode 221. 最大正方形 1277. 统计全为 1 的正方形子矩阵 DP

思路:

221题和1277题非常相似,思路也相同,不同的是状态转移方程变了一点,由取最大值,变成了加法。

以最大正方形为例,考虑当前i行j列,dpij代表为右下顶点为ij的正方形的最大边长,那么状态是由三个方向的状态转移而来的,分别是相邻左边,相邻上边,相邻左上角。所以,dp[i][j]=1+min(dp[i][j-1],dp[i-1][j],dp[i-1][j-1])。

代码:

class Solution {
public:
      int dp1[10000];
    int maximalSquare(vector<vector<char>>& matrix) {
        if(!matrix.size())return 0;
        int maxx=0;
        int n=matrix.size(),m=matrix[0].size();
        int dp[n+2][m+2];
        memset(dp,0,sizeof(dp));
        int pre=0;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                char c=matrix[i-1][j-1];
                //int tmp=dp1[j];
                if(c=='1')
                {
                    dp[i][j]=1+min(min(dp[i][j-1],dp[i-1][j]),(dp[i-1][j-1]));
                    //dp1[j]=1+min(dp1[j],min(dp1[j-1],pre));
                    maxx=max(maxx,dp[i][j]);
                }else dp[i][j]=0;
                //pre=tmp;
            }
        }
        return maxx*maxx;
    }
};
class Solution {
public:
    int dp[1000][1000];
    int countSquares(vector<vector<int>>& matrix) {
        int n=matrix.size();
        if(!n)return 0;
        int m=matrix[0].size();
        int ans=0;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(j==0||i==0)
                {
                    dp[i][j]=matrix[i][j];
                }else if(matrix[i][j])
                {
                    dp[i][j]=1+min(dp[i-1][j-1],min(dp[i-1][j],dp[i][j-1]));
                }
                ans+=dp[i][j];
            }
        }
        return ans;
    }
};
发布了1062 篇原创文章 · 获赞 72 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/lanshan1111/article/details/105564656