您的位置:首页 > 其它

uva1330 - City Game

2016-02-13 11:59 423 查看
题意:

一个m*n的矩阵,一些格子是空地(F),一些格子被租用了(R),求空地中的最大矩形的格子数*3

思路:

记录每个格子向上拥有的最大空地的个数,然后再扫描每个格子,记录每个格子向左和向右的最大空地数,再保留最大矩阵的格子数

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1005;
int n, m, g

;

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
, r
;
/*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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: