写了个O(n4)的暴力,然后一发过了?
#include <bits/stdc++.h>
using namespace std;
int read() {
char c; int num, f = 1;
while(c = getchar(),!isdigit(c)) if(c == '-') f = -1; num = c - '0';
while(c = getchar(), isdigit(c)) num = num * 10 + c - '0';
return f * num;
}
int n, m, g[2509][2509], maxn, ans;
int main()
{
n = read(); m = read();
for(int i = 1; i <= n ;i++)
for(int j = 1; j <= m; j++)
g[i][j] = read();
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
int f = 1;
maxn = 0;
for(int len = 1; len + i - 1 <= n && len + j - 1 <= m; len++) {
f = 1;
if(g[i + len - 1][j + len - 1] != 1) break;
for(int k = i; k < len + i - 1; k++) {
if(g[k][len + j - 1] == 1) {
f = 0;
break;
}
}
for(int k = j; k < len + j - 1; k++) {
if(g[len + i - 1][k] == 1) {
f = 0;
break;
}
}
if(f == 0) break;
else maxn++;
}
ans = max(ans, maxn);
}
}
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
int f = 1;
maxn = 0;
for(int len = 1; len + i - 1 <= n && j - len + 1 > 0; len++) {
f = 1;
if(g[i + len - 1][j - len + 1] != 1) break;
for(int k = i; k < len + i - 1; k++) {
if(g[k][j - len + 1] == 1) {
f = 0;
break;
}
}
for(int k = j; k > j - len + 1; k--) {
if(g[len + i - 1][k] == 1) {
f = 0;
break;
}
}
if(f == 0) break;
else maxn++;
}
ans = max(ans, maxn);
}
}
printf("%d\n", ans);
return 0;
}