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 }
光伴随的阴影