自学内容网 自学内容网

[二维前缀和]最大纯色正方形

题目描述

铺砖的工人来到一个操场,将整个操场按正方形铺砖(整个操场可视为R行C列的矩阵,矩阵的每个元素为一块正方形砖块),正方形砖块有两种,一种为蓝色,另一种为红色。请你写一个程序求出为最大纯色正方形的面积。

输入格式

第一行两个正整数R和C。 接下来R行C列描述整个操场,红色砖块用1来表示,蓝色砖块用0来表示。

输出格式

一个数,表示最大纯色正方形的面积。

样例输入/输出

输入数据 1

5 8
0 0 0 1 1 1 0 1
1 1 0 1 1 1 1 1
0 1 1 1 1 1 0 1
1 0 1 1 1 1 1 0
1 1 1 0 1 1 0 1

输出数据 1

9

数据规模与提示

100%的数据R,C<=200;

时间限制:1s.

内存限制:128MB.

解!!!

这道题可以使用二维前缀和来解决。

首先,我们需要构建一个二维前缀和的数组sum,sum[i][j]表示以(i,j)为右下角的正方形区域内的红色砖块的数量。

我们可以通过以下方式构建sum数组:

1. 遍历每个格子(i,j),将砖块的颜色e[i][j]保存到数组中,并计算sum[i][j]的值:

sum[i][j] = sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1] + e[i][j]

这样,sum数组的每个元素就表示了以(i,j)为右下角的正方形区域内的红色砖块的数量。

接下来,我们需要从最大可能的正方形大小开始遍历,找到一个满足条件的正方形。

假设最大可能的正方形大小为n,我们从n开始递减遍历,对于每个正方形大小k,我们从左上角的位置(x,y)开始遍历操场区域。

具体的遍历方式如下:

1. 遍历所有可能的左上角位置(x,y),满足条件x+k-1<=a且y+k-1<=b(保证正方形不超出操场的范围)。

2. 对于每个左上角位置(x,y),计算右下角位置(x2,y2):x2=x+k-1,y2=y+k-1。

3. 计算以(x2,y2)为右下角的正方形区域内的红色砖块的数量d:

d = sum[x2][y2] - sum[x-1][y2] - sum[x2][y-1] + sum[x-1][y-1]

4. 如果d等于0或者等于k*k(即整个区域内都是红色砖块或者蓝色砖块),则找到了一个满足条件的正方形,输出其面积k*k。

5. 如果没有找到满足条件的正方形,继续递减正方形大小k,重复步骤2-4。

最后,如果没有找到任何满足条件的正方形,则输出0。

C++代码实现:

#include<bits/stdc++.h>
using namespace std;
long long a,b,e[1000][1000],sum[1000][1000];
int main()
{
    cin>>a>>b;
    for(long long i=1;i<=a;i++)
    {
        for(int j=1;j<=b;j++)
        {
            cin>>e[i][j];
            sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+e[i][j];
        }
    }
    long long n=min(a,b);
    for(int k=n;k>=1;k--)
    {
        for(int x=1;x+k-1<=a;x++)
        {
            for(int y=1;y+k-1<=b;y++)
            {
                long long x2=x+k-1;
                long long y2=y+k-1;
                long long d=sum[x2][y2]-sum[x-1][y2]-sum[x2][y-1]+sum[x-1][y-1];
                if(d==0||d==k*k)
                {
                    cout<<k*k;
                    return 0;
                }
            }
        }
    }
    
    cout<<0;
    return 0;
}

这样就可以找到最大纯色正方形的面积了。

点个赞吧,帅哥美女们,本人为小学生。


原文地址:https://blog.csdn.net/gcliyilin/article/details/143469590

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!