leetcode力扣221. 最大正方形(动态规划dp)

题目传送门
题意:
在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵(n*m)内,找到只包含 ‘1’ 的最大正方形,并返回其面积。
题解:
主要思路就是正方形的对角线,比如现在已经有一个正方形的区域,那么在该正方形的基础上要使得边长再+1,那么就需要最右边增加一列和最下面再增加一排(对于(i,j)我们i从0到n枚举,j从0,m枚举),也就是说对于(i,j)为右下角的正方形而言,在(i-1,j-1)的基础之上只需在考虑一下i这一行,以及j这一列连续的‘1’是否比(i-1,j-1)的正方形边长更大就行。动态数组为dp[ MAXN ][ MAXN ][ 3 ],
dp[ i ][ j ][ 0 ]代表从(i,j)向上有多少个连续的‘1’,dp[ i ][ j ][ 1 ]代表从(i,j)向左有多少个连续的‘1’,dp[ i ][ j ][ 2 ]代表以(i,j)为右下角的正方形的边长是多少。
动态转移方程为:
dp[ i ][ j ][ 0 ]=dp[ i-1 ][ j ][ 0 ]+(matrix[ i ][ j ] ==‘1’);
dp[ i ][ j ][ 1 ]=dp[ i ][ j-1 ][ 1 ]+(matrix[ i ][ j ] ==‘1’);
dp[ i ][ j ][ 2 ]=min(min(dp[ i ][ j ][ 0 ],dp[ i ][ j ][ 1 ]),dp[ i-1 ][ j-1 ][ 2 ])+1
具体看代码

class Solution {
   
public:
    #include<bits/stdc++.h>
    int dp[305][305][3];
    int maximalSquare(vector<vector<char>>& matrix) {
   
        int n=matrix.size(),m=matrix[0].size();
        for(int i=0;i<=n;i++){
   
            for(int j=0;j<=m;j++){
   
                dp[i][j][0]
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值