[luoguP2701] [USACO5.3]巨大的牛棚Big Barn(DP)
经典问题。
找出最大的不包含 1 的正方形。
f[i][j] 表示 以 (i,j) 结尾的最大的不包含 1 的正方形
f[i][j] = min(f[i - 1][j], f[i][j - 1], f[i - 1][j - 1]) + 1
画个图意会一下
——代码
1 #include <cstdio> 2 #include <iostream> 3 4 const int MAXN = 1001; 5 int n, m, ans; 6 int f[MAXN][MAXN]; 7 bool a[MAXN][MAXN]; 8 9 inline int read() 10 { 11 int x = 0, f = 1; 12 char ch = getchar(); 13 for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1; 14 for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0'; 15 return x * f; 16 } 17 18 inline int min(int x, int y) 19 { 20 return x < y ? x : y; 21 } 22 23 inline int max(int x, int y) 24 { 25 return x > y ? x : y; 26 } 27 28 int main() 29 { 30 int i, j, x, y; 31 n = read(); 32 m = read(); 33 for(i = 1; i <= m; i++) 34 { 35 x = read(); 36 y = read(); 37 a[x][y] = 1; 38 } 39 for(i = 1; i <= n; i++) 40 for(j = 1; j <= n; j++) 41 if(!a[i][j]) 42 f[i][j] = min(f[i - 1][j - 1], min(f[i - 1][j], f[i][j - 1])) + 1, 43 ans = max(ans, f[i][j]); 44 printf("%d\n", ans); 45 return 0; 46 }