最大正方形-二维前缀和

题目:

https://www.luogu.com.cn/problem/P1387

在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长

重点:

if(a[i][j])
b[i][j]=min(min(b[i-1][j],b[i][j-1]),b[i-1][j-1])+1;

比如例子1:
输入:

4 4
0 1 1 1
1 1 1 0
0 1 1 0
1 1 0 1

b的矩阵为
0 1 1 1
1 1 2 0
0 1 2 0
1 1 0 1

比如例子2:
输入:

8 8
0 0 0 0 1 1 1 1
0 1 0 1 1 1 1 1
1 1 1 0 1 0 1 1
1 0 1 1 1 1 1 1
0 1 1 1 1 1 1 1
1 1 0 1 1 1 1 1
1 0 1 1 1 1 1 1
1 1 1 1 1 1 1 1

输出:

0 0 0 0 1 1 1 1
0 1 0 1 1 2 2 2
1 1 1 0 1 0 1 2
1 0 1 1 1 1 1 2
0 1 1 2 2 2 2 2
1 1 0 1 2 3 3 3
1 0 1 1 2 3 4 4
1 1 1 2 2 3 4 5

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int a[107][107],b[107][107];
int main()
{
    int n,m;
    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        scanf("%d",&a[i][j]);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
             if(i==1&&j==1)
            {
                if(a[i][j])
                    b[i][j]=1;
                else
                    b[i][j]=0;
            }
            else
            {
                if(a[i][j])
                    b[i][j]=min(min(b[i-1][j],b[i][j-1]),b[i-1][j-1])+1;

            }
        }

    }
    int mm=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        { mm=max(mm,b[i][j]);
        }
    }
       printf("%d\n",mm);
}

 

posted @ 2021-07-13 16:25  废柴废柴少女  阅读(67)  评论(0)    收藏  举报