hdu 1505 City Game

题目链接: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保存最大的面积。 

 

hdu 1505  City Game
 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, 0sizeof(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 }
View Code 

hdu 1505 City Game

上一篇:Repeater嵌套绑定Repeater以及内层调用外层数据


下一篇:iBATIS介绍,iBATIS是什么?