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;
}