码迷,mamicode.com
首页 > 其他好文 > 详细

[洛谷1681]最大正方形II

时间:2017-08-18 13:33:28      阅读:102      评论:0      收藏:0      [点我收藏+]

标签:min   tchar   clu   getch   type   span   div   style   std   

思路:
对于矩阵中的每一个元素,处理出它能扩展到的上边界$up$、左边界$left$,DP得出以该元素为右下角的最大正方形。
状态转移方程:$f_{i,j}=min(f_{i-1,j-1},up_{i,j},left_{i,j})$。

 1 #include<cstdio>
 2 #include<cctype>
 3 #include<algorithm>
 4 inline int getint() {
 5     char ch;
 6     while(!isdigit(ch=getchar()));
 7     int x=ch^0;
 8     while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^0);
 9     return x;
10 }
11 const int inf=0x7ffffffe;
12 int main() {
13     int n=getint(),m=getint();
14     bool a[2][m+1];
15     int up[2][m+1],left[2][m+1],f[2][m+1];
16     f[1][0]=inf;
17     for(register int i=0;i<=m;i++) f[0][i]=inf;
18     int ans=0;
19     for(register int i=1;i<=n;i++) {
20         for(register int j=1;j<=m;j++) {
21             a[i&1][j]=getint();
22             up[i&1][j]=(i==1||a[i&1][j]==a[!(i&1)][j])?1:(up[!(i&1)][j]+1);
23             left[i&1][j]=(j==1||a[i&1][j]==a[i&1][j-1])?1:(left[i&1][j-1]+1);
24             f[i&1][j]=std::min(f[!(i&1)][j-1]+1,std::min(up[i&1][j],left[i&1][j]));
25             ans=std::max(ans,f[i&1][j]);
26         }
27     }
28     printf("%d\n",ans);
29     return 0;
30 }

 

[洛谷1681]最大正方形II

标签:min   tchar   clu   getch   type   span   div   style   std   

原文地址:http://www.cnblogs.com/skylee03/p/7389063.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!