1. 程式人生 > >New Land LightOJ - 1424

New Land LightOJ - 1424

枚舉 amp 一行 sca n) algo href include ref

New Land LightOJ - 1424

題意:找出01矩陣中最大的完全由0組成的矩陣。

方法:

重點在於轉化。

先預處理(i,j)點向上最長能取到的連續的全0條的長度。然後枚舉某一行作為矩陣的最下面一行,就可以把題目轉化為LOJ-1083。用那道題的任意一種方法做即可。

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 int a[2010][2010],s1[2010][2010],left[2010],right[2010];
 5 int ans,TT,T,m,n;
 6 int
main() 7 { 8 int i,j; 9 scanf("%d",&T); 10 for(TT=1;TT<=T;TT++) 11 { 12 ans=0; 13 scanf("%d%d",&m,&n); 14 for(i=1;i<=m;i++) 15 for(j=1;j<=n;j++) 16 scanf("%1d",&a[i][j]); 17 for(i=1;i<=m;i++)
18 for(j=1;j<=n;j++) 19 if(a[i][j]==1) 20 s1[i][j]=0; 21 else 22 s1[i][j]=s1[i-1][j]+1; 23 for(i=1;i<=m;i++) 24 { 25 for(j=1;j<=n;j++) 26 { 27 left[j]=j;
28 while(left[j]>1&&s1[i][left[j]-1]>=s1[i][j]) left[j]=left[left[j]-1]; 29 } 30 for(j=n;j>=1;j--) 31 { 32 right[j]=j; 33 while(right[j]<n&&s1[i][right[j]+1]>=s1[i][j]) right[j]=right[right[j]+1]; 34 } 35 for(j=1;j<=n;j++) 36 ans=max(ans,s1[i][j]*(right[j]-left[j]+1)); 37 } 38 printf("Case %d: %d\n",TT,ans); 39 } 40 return 0; 41 }

New Land LightOJ - 1424