题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1505
题意:n*m的地区里有被占用的、有空闲的的地,求最大内置矩形。
s[i][j]为累计到第i行每列的连续空闲地块数。
然后枚举每一行,以该行为基线求最大矩形,方法类似hdu 1506。
即l[j]、r[j]分别保存以s[i][j]为高的矩形能到达最左和最右,然后枚举每点,ans保存最大的面积。
1 #include <cstdio>
2 #include <cstring>
3 #define N 1005
4
5 int a[N][N], s[N][N], l[N], r[N];
6 int max2(int x, int y)
7 {
8 return x > y ? x : y;
9 }
10
11 int main()
12 {
13 int t, n, m;
14 char ch[5];
15 scanf("%d",&t);
16 while(t--)
17 {
18 scanf("%d%d",&n,&m);
19 for(int i=1; i<=n; i++)
20 {
21 for(int j=1; j<=m; j++)
22 {
23 scanf("%s",ch); //这题卡字符输入
24 if(ch[0]==‘R‘) a[i][j] = 0;
25 else if(ch[0]==‘F‘) a[i][j] = 1;
26 }
27 }
28
29 int ans = 0;
30 memset(s, 0, sizeof(s));
31 for(int i=1; i<=n; i++)
32 {
33 for(int j=1; j<=m; j++)
34 {
35 if(a[i][j]==1) s[i][j] = s[i-1][j] + 1; //求累计高度
36 l[j] = r[j] = j;
37 }
38 for(int j=2; j<=m; j++) //求最左
39 {
40 while(l[j]-1>=1 && s[i][l[j]-1]>=s[i][j])
41 l[j] = l[l[j]-1];
42 }
43 for(int j=m-1; j>=1; j--) //求最右
44 {
45 while(r[j]+1<=m && s[i][r[j]+1]>=s[i][j])
46 r[j] = r[r[j]+1];
47 }
48 for(int j=1; j<=m; j++) //枚举每个高度,求最大矩形
49 {
50 ans = max2(ans, (r[j]-l[j]+1)*s[i][j]);
51 }
52 }
53 printf("%d\n",ans*3);
54 }
55 return 0;
56 }
2 #include <cstring>
3 #define N 1005
4
5 int a[N][N], s[N][N], l[N], r[N];
6 int max2(int x, int y)
7 {
8 return x > y ? x : y;
9 }
10
11 int main()
12 {
13 int t, n, m;
14 char ch[5];
15 scanf("%d",&t);
16 while(t--)
17 {
18 scanf("%d%d",&n,&m);
19 for(int i=1; i<=n; i++)
20 {
21 for(int j=1; j<=m; j++)
22 {
23 scanf("%s",ch); //这题卡字符输入
24 if(ch[0]==‘R‘) a[i][j] = 0;
25 else if(ch[0]==‘F‘) a[i][j] = 1;
26 }
27 }
28
29 int ans = 0;
30 memset(s, 0, sizeof(s));
31 for(int i=1; i<=n; i++)
32 {
33 for(int j=1; j<=m; j++)
34 {
35 if(a[i][j]==1) s[i][j] = s[i-1][j] + 1; //求累计高度
36 l[j] = r[j] = j;
37 }
38 for(int j=2; j<=m; j++) //求最左
39 {
40 while(l[j]-1>=1 && s[i][l[j]-1]>=s[i][j])
41 l[j] = l[l[j]-1];
42 }
43 for(int j=m-1; j>=1; j--) //求最右
44 {
45 while(r[j]+1<=m && s[i][r[j]+1]>=s[i][j])
46 r[j] = r[r[j]+1];
47 }
48 for(int j=1; j<=m; j++) //枚举每个高度,求最大矩形
49 {
50 ans = max2(ans, (r[j]-l[j]+1)*s[i][j]);
51 }
52 }
53 printf("%d\n",ans*3);
54 }
55 return 0;
56 }