HDU 1505 City Game

这题是上一题的升级版

关键在于条形图的构造,逐行处理输入的矩阵,遇到'F'则在上一次的条形图基础上再加1,遇到'R'则置为0

然后用上一题的算法,求每行对应条形图的最大矩阵的面积。

 

另外:本来是debug都不用就1A的节奏。可在输入数据上,一开始我用的是scanf读入字符 和 getchar跳过无效字符,在测试数据上是没有问题的,但一交上去就WA掉了。

看到别人的代码使用cin读入的。其实,如果输入数据不太大的话,cin还是比较放心好用的。

 

 1 //#define LOCAL

 2 #include <iostream>

 3 #include <cstdio>

 4 #include <cstring>

 5 #include <algorithm>

 6 using namespace std;

 7 

 8 const int maxn = 1010;

 9 char map[maxn][maxn];

10 int h[maxn], l[maxn], r[maxn];

11 

12 int main(void)

13 {

14     #ifdef LOCAL

15         freopen("1505in.txt", "r", stdin);

16     #endif

17 

18     int T;

19     scanf("%d", &T);

20     while(T--)

21     {

22         int row, col;

23         scanf("%d%d", &row, &col);

24         getchar();

25         int i, j;

26         for(i = 1; i <= row; ++i)

27             for(j = 1; j <= col; ++j)

28                 cin >> map[i][j];

29 

30         memset(h, 0, sizeof(h));

31         l[1] = 1, r[col] = col;

32         int t, ans = -1;

33         for(i = 1; i <= row; ++i)

34         {

35             for(j = 1; j <= col; ++j)

36                 if(map[i][j] == 'F')

37                     ++h[j];

38                 else

39                     h[j] = 0;

40 

41             for(j = 2; j <= col; ++j)

42             {

43                 t = j;

44                 while(t > 1 && h[j] <= h[t-1])

45                     t = l[t-1];

46                 l[j] = t;

47             }

48             for(j = col-1; j > 0; --j)

49             {

50                 t = j;

51                 while(t < col && h[j] <= h[t+1])

52                     t = r[t+1];

53                 r[j] = t;

54             }

55             for(j = 1; j <= col; ++j)

56                 ans = max(ans, (r[j]-l[j]+1)*h[j]);

57         }

58         printf("%d\n", ans * 3);

59     }

60     return 0;

61 }
代码君

 

你可能感兴趣的:(game)