uva1330 - City Game

来源:互联网 发布:淘宝详情页思路 编辑:程序博客网 时间:2024/06/15 05:42

题意:
一个m*n的矩阵,一些格子是空地(F),一些格子被租用了(R),求空地中的最大矩形的格子数*3
思路:
记录每个格子向上拥有的最大空地的个数,然后再扫描每个格子,记录每个格子向左和向右的最大空地数,再保留最大矩阵的格子数
代码:

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 1005;int n, m, g[N][N];int main(){    int cas;    scanf("%d", &cas);    while (cas--) {        scanf("%d%d", &n, &m);        int i, j;        for (i = 1; i <= n; i++) {            for (j = 1; j <= m; j++) {                char ch = getchar();                while (ch != 'R'&&ch != 'F')                    ch = getchar();                if (ch == 'R')                    g[i][j] = 0;                else                    g[i][j] = g[i-1][j] + 1;            }        }        int ans = 0,l[N], r[N];        /*for (i = 1; i <= n; i++){            for (j = 1; j <= m; j++)                printf("%d\t", g[i][j]);            printf("\n");        }*/        for (i = 1; i <= n; i++) {            g[i][0] = g[i][m + 1] = -1;            for (j = 1; j <= m; j++)                l[j] = r[j] = j;            for (j = 1; j <= m; j++)                 while (g[i][j] <= g[i][l[j] - 1])                    l[j] = l[j] - 1;            for (j = m; j > 0; j--) {                while (g[i][j] <= g[i][r[j] + 1])                    r[j] = r[j] + 1;                ans = max(ans, g[i][j] * (r[j] - l[j] + 1));            }        }        printf("%d\n", ans*3);    }    return 0;}
0 0
原创粉丝点击