(动态规划)221.最大正方形

本文探讨了在由0和1组成的二维矩阵中寻找只包含1的最大正方形问题,通过动态规划方法解决,介绍了递推公式及其实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。

示例:

输入:

1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0

输出: 4

分析

最大正方形,我们要知道以点(i,j)为右下角的最大正方形其与左上角、左边以及上边点组成的正方形有关,其关系是:如果此格是1,以此为右下角的正方形的最大边长为:上面的正方形、左面的正方形或左上的正方形中,最小的那个,再加上此格。
如图所示:
图片来自在这里插入图片描述
dp[i+1][j+1]代表的是以点(i,j)为右下角的正方形的最大边长值
则递推公式为: dp[i+1][j+1]=min(dp[i][j],min(dp[i][j+1],dp[i+1][j]))+1;
如果使用dp[i][j]代表的是以点(i,j)为右下角的正方形的最大边长值,那么递推公式就会有i-1和j-1出现,此时当i或者j等于0,其dp就不在区间内。
因为求最大的动态规划问题,所以初始值初始化为0,初始矩阵是(m+1)×(n+1)

代码

class Solution {
public:
    int maximalSquare(vector<vector<char>>& matrix) {
        if(matrix.empty())//矩阵为空
        {
            return 0;
        }
        int m=matrix.size();
        int n=matrix[0].size();
        vector<vector<int>> dp(m+1,vector<int>(n+1,0));//求最大,所以初始赋值为0
        int ans=0;//正方形的边长值
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(matrix[i][j]=='0')
                {
                    continue;
                }
                dp[i+1][j+1]=min(dp[i][j],min(dp[i][j+1],dp[i+1][j]))+1;
                //dp[i+1][j+1]代表的是以点(i,j)为右下角的最大边长值,为什么不使用dp[i][j]表示
                ans=max(ans,dp[i+1][j+1]);
            }
        }
        return ans*ans;

    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值