是否样例过水?
查看原帖
是否样例过水?
66548
onglu楼主2021/2/25 09:07

写了个O(n4)O(n^4)的暴力,然后一发过了?

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

2021/2/25 09:07
加载中...