首先,此题在输入地图时, R 与 F 之间并不一定是一个空格
因此 采用下面的代码输入,会导致wa,尽管你怎么测试都是对的。
scanf("%d%d",&n,&m);
getchar();
for(i = 1; i <= n; i++)
{
for(j = 1; j <= m; j++)
{
scanf("%c%*c",&a);
if(a == 'F') map[i][j] = map[i - 1][j] + 1;
else map[i][j] = 0;
}
}
正确的方式是使用 scanf("%s",a);
getchar();
for(i = 1; i <= n; i++)
{
for(j = 1; j <= m; j++)
{
scanf("%s",a);
if(a[0] == 'F') map[i][j] = map[i - 1][j] + 1;
else map[i][j] = 0;
}
}
然后,关于具体做法:
首先对整个地图进行标号,如下
每个数字表示该位置到顶端的长度,若有R,则记为0,并作为一个顶端。
在学会hdu 1506的扩展方法后,应用于此。1506百度解题报告都有详细的讲解。
一行一行的加入。首先求第一行每个点在 只有一行 的情况下,分别求得所能扩展得到的最大点数。(此处的“扩展”就是hdu1506的方法)
如上例中,第一行第二个,能得到的最大点数就是 1 × 5 = 5
然后加入第二行,求第二行每个点在 有两行 的情况下,分别求得所能扩展得到的最大点数。
一行一行下去,并不断比较最大值,并保存。最后输出最大值。
#include<string.h>
#include<iostream>
#include<algorithm>
#include<stdlib.h>
#include<cstdio>
#include<cmath>
using namespace std;
int map[1005][1005];
int main()
{
// freopen("t.txt","r",stdin);
char a[10];
int l[1005],r[1005];
int t,m,n,u,s,maxx,i,j;
scanf("%d",&t);
while(t--)
{
maxx = 0;
memset(map,0,sizeof(map));
scanf("%d%d",&n,&m);
getchar();
for(i = 1; i <= n; i++)
{
for(j = 1; j <= m; j++)
{
scanf("%s",a);
if(a[0] == 'F') map[i][j] = map[i - 1][j] + 1;
else map[i][j] = 0;
}
}
for(i = 1; i <= n; i++)
{
map[i][0] = map[i][m+1] = 0;
for(j = 1; j <= m; j++)
{
u = j;
while(map[i][j] <= map[i][u - 1] && u > 1) u = l[u - 1];
l[j] = u;
}
for(j = m; j >= 1; j--)
{
u = j;
while(map[i][j] <= map[i][u + 1] && u < m) u = r[u + 1];
r[j] = u;
}
for(j = 1; j <= m; j++)
{
s = (r[j] - l[j] + 1) * map[i][j];
maxx = max(maxx,s);
}
}
printf("%d\n",3*maxx);
}
return 0;
}