找方块

1746: 找方块

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 111  Solved: 3
[Submit][Status][Web Board]

Description

小明最近看到一件艺术品,是由许多黑白方块组成的矩形图,但是并不是黑白相间的。小明希望找到一个最大的黑白相间的矩形。

Input

第一行输入T(T<=10)。
接下来输入T组数据,每组数据第一行为N,表示这个艺术品的矩阵大小是N * N(N <=1000)。
接下来是一个N * N的矩阵,0代表黑色,1代表白色。

Output

对于每组数据,输出最大的黑白相间矩形的面积。
每组输出占一行。

Sample Input

1
2
0 1
1 0

Sample Output

4

//dp控制每一个点的高度,到时候直接扫列就行,需要注意的是行和列交换的需要在扫一遍不然有可能错,矩阵转置用本地转置法

# include <iostream>
# include <cstring>
# include <cstdio>

using namespace std;
const int maxn = 1005;

int dp[maxn][maxn];//控制高度
int m[maxn][maxn];

int main(int argc, char *argv[])
{
    int t;
    scanf("%d",&t);
    {
        while(t--)
        {
            int n;
            scanf("%d",&n);
            for(int i = 0; i < n; i++)
            {
                for(int j = 0; j < n; j++)
                {
                    scanf("%d",&m[i][j]);
                    dp[i][j] = 1;
                }
            }
            for(int i = 1; i < n; i++)
            {
                for(int j = 0; j < n; j++)
                {
                    if(m[i -1][j] != m[i][j])
                    {
                        dp[i][j] = dp[i - 1][j] + 1;
                    }

                }
            }
            int area = 0;
            for(int i = 0; i < n; i++)
            {
                int h , len = 1;
                for(int j = 0; j < n; j++)
                {
                    if(j == 0)
                    {
                        h = dp[i][j];
                        area = max(area, h * len);
                    }
                    else
                    {
                        if(m[i][j] != m[i][j - 1])
                        {
                            len++;
                            h = min(h, dp[i][j]);
                            area = max(area, h * len);
                        }
                        else
                        {
                            h = dp[i][j];
                            len = 1;
                            area = max(area, h * len);
                        }
                    }
                }
            }

            for(int i = 0; i < n; i++)
            {
                for(int j = 0; j < i; j++)
                {

                    m[i][j] = m[j][i];
                    dp[i][j] = 1;
                }
            }
            for(int i = 1; i < n; i++)
            {
                for(int j = 0; j < n; j++)
                {
                    if(m[i -1][j] != m[i][j])
                    {
                        dp[i][j] = dp[i - 1][j] + 1;
                    }

                }
            }

            for(int i = 0; i < n; i++)
            {
                int h, len = 1;
                for(int j = 0; j < n; j++)
                {
                    if(j == 0)
                    {
                        h = dp[i][j];
                        area = max(area, h * len);
                    }
                    else
                    {
                        if(m[i][j] != m[i][j - 1])
                        {
                            len++;
                            h = min(h, dp[i][j]);
                            area = max(area, h * len);
                        }
                        else
                        {
                            h = dp[i][j];
                            len = 1;
                            area = max(area, h * len);
                        }
                    }
                }
            }

            printf("%d\n",area);

        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/I_O_fly/article/details/84317262