【题意】在一个 n*m 的土地中 中有瑕疵的为0 完好的为1 其中最大的正方形无瑕疵土地 输出其边长。
【思路】d[i][j]为 以点 i j 为左上角的正方形最大的边长
显然要是a[i][j]=0 则d[i][j]=0
要是a[i][j]=1 则 d[i][j]=min(d[i+1][j],d[i+1][j+1],d[i][j+1])+1 ( 画一下图就知道了 )
【注意】for(j=m;j>=1;j--)
for(i=n;i>=1;i--) 这样才能保证在算d[i][j]时已经算出 d[i+1][j],d[i+1][j+1],d[i][j+1] 了
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; int a[1002][1002],d[1002][1002];//d[i][j]以i j 为左上角的顶点 int min(int a,int b,int c) { if(a<=b&&a<=c) return a; if(b<=a&&b<=c) return b; return c; } int main() { int i,j,n,m,t,k,q; while(~scanf("%d%d",&n,&m)) { for(i=1;i<=n;i++) for(j=1;j<=m;j++) scanf("%d",&a[i][j]); memset(d,0,sizeof(d)); int maxx=0; for(j=m;j>=1;j--) for(i=n;i>=1;i--) { if(a[i][j]==1) d[i][j]=min(d[i+1][j],d[i+1][j+1],d[i][j+1])+1; else d[i][j]=0; if(maxx<d[i][j]) maxx=d[i][j]; } } return 0; }