题干:
给出一个 n∗m 的仅包含 01 的矩阵,求该矩阵中仅包含 0 的最大矩阵
样例输入1:
3 2
10
11
11
输出1:
1
样例输入2:
10
111
000
110
001
001
110
101
011
111
001
输出2:
4
我的代码:40pts,没法下载错误数据
#include<bits/stdc++.h>
#define debug cout << "OK" << endl;
using namespace std;
int n, m, mx = 0;
bool clr[510][510];
int dp[510][510][2][2]; //dp[i][j][0/1][0/1]:以点i,j为右下角/左下角的最大矩形的纵向长度/横向长度
int main()
{
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
char c;
scanf(" %c", &c);
clr[i][j] = (c == '1');
}
}
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
if(clr[i][j])
{
continue;
}
int m1 = 0, m2 = 0, m3 = 0;
for(int k = i - 1; k > 0 && !clr[k][j]; k--)
{
m1++;
}
for(int k = j - 1; k > 0 && !clr[i][k]; k--)
{
m2 ++;
}
for(int k = j + 1; k <= m && !clr[i][k]; k++)
{
m3++;
}
dp[i][j][0][0] = min(dp[i - 1][j - 1][0][0], m1) + 1;
dp[i][j][0][1] = min(dp[i - 1][j - 1][0][1], m2) + 1;
dp[i][j][1][0] = min(dp[i - 1][j + 1][1][0], m1) + 1;
dp[i][j][1][1] = min(dp[i - 1][j + 1][1][1], m3) + 1;
mx = max(mx, max(dp[i][j][0][0] * dp[i][j][0][1], dp[i][j][1][0] * dp[i][j][1][1]));
}
}
cout << mx << endl;
return 0;
}
大佬轻喷爆踩