[TimeGate]
https://www.luogu.org/problem/P2701
【解题思路】
f[i][j]=min(min(f[i][j-1],f[i-1][j]),f[i-1][j-1])+1;
f(i,j)表示以(i,j)为右下角的最大正方形的边长。
【code】
1 #include <cstdio>
2 #include <iostream>
3 #include <algorithm>
4 using namespace std; 5 int n,t,x,y,ans=-1<<29; 6 bool vis[1005][1005]; 7 int f[1005][1005]; 8 int main(){ 9 //freopen("2701.in","r",stdin); 10 //freopen("2701.out","w",stdout);
11 scanf("%d%d",&n,&t); 12 while(t--){ 13 scanf("%d%d",&x,&y); 14 vis[x][y]=true; 15 } 16 for(register int i=1;i<=n;i++){ 17 for(register int j=1;j<=n;j++){ 18 if(!vis[i][j]) 19 f[i][j]=min(f[i-1][j-1],min(f[i][j-1],f[i-1][j]))+1; 20 ans=max(ans,f[i][j]); 21 } 22 } 23 printf("%d\n",ans); 24 return 0; 25 }