HDU1505 City Game/玉蟾宫/全0子矩阵 悬线法

题意: 给出一个像这样的矩阵

           R F F F F F

    F F F F F F

    R R R F F F

       F F F F F F

    F F F F F F

 求F组成的最大子矩阵(面积最大) 有多组数据

 

  优秀的暴力???

  思路:枚举每个点 然后这个点可以往上延伸到最上的点 这两点为一根线 这根线左移移到最左可以到的地方 右边也是如此 然后算出面积

                   需要预处理出每个点往左延伸的最远点与往右延伸的最远点

 

code

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #define M 1010
 5 #define go(i,a,b) for(register int i=a;i<=b;i++)
 6 #define goo(i,a,b) for(register int i=a;i>=b;i--)
 7 #define mem(i) memset(i,0,sizeof(i));
 8 using namespace std;
 9 int read()
10 {
11   char c; c=getchar(); while(c!='F'&&c!='R') c=getchar();
12   if(c=='F') return 1; return 2;
13 }
14 int map[M][M],l[M][M],r[M][M],u[M][M];
15 int m,n,ans,t;
16 void init()
17 {
18   go(i,1,m) go(j,2,n)
19     if(map[i][j]==1&&map[i][j-1]==1) l[i][j]=l[i][j-1];
20   go(i,1,m) goo(j,n-1,1)
21     if(map[i][j]==1&&map[i][j+1]==1) r[i][j]=r[i][j+1];
22 }
23 int main()
24 {
25   scanf("%d%d",&m,&n);
26   go(i,1,m) go(j,1,n)
27     {
28       map[i][j]=read();
29       if(map[i][j]==1) u[i][j]=1;
30       l[i][j]=j;r[i][j]=j;
31     }
32       
33   init();
34 
35   go(i,1,m) go(j,1,n)
36     {
37       if(i>1&&map[i][j]==1&&map[i-1][j]==1)
38       {
39         l[i][j]=max(l[i][j],l[i-1][j]);
40         r[i][j]=min(r[i][j],r[i-1][j]);
41         u[i][j]=u[i-1][j]+1;
42       }
43       ans=max(ans,(r[i][j]-l[i][j]+1)*u[i][j]);
44     }
45       
46   printf("%d\n",ans*3);
47   return 0;
48 }

 

posted @ 2018-12-15 22:05  DTTTTTTT  阅读(133)  评论(0编辑  收藏  举报