我看了题解之后写的很快。
但是却花费了一下午的时间改错。
算法的主要流程没有问题,竟然是错在了数据的读取上。
注释部分是我的写法,这么写测试大部分用例都成功了,但是WA。
改用cin后AC。
不知道原因是什么。
下面这个博主和我的经历类似。
https://blog.csdn.net/Ice_Crazy/article/details/7545662
下面是AC代码。
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
int map[1001][1001];
int r[1001];
int l[1001];
int main()
{
int K;
int a, b;
int i, j;
int max;
char c;
scanf("%d", &K);
while (K--)
{
scanf("%d %d", &a, &b);
memset(map, 0, sizeof(map));
getchar();
for (i = 1; i <= a; i++)
{
for (j = 1; j <= b; j++)
{
/* wa
scanf("%c", &c);
getchar();
*/
cin >> c;
if ('F' == c)
map[i][j] = 1;
}
}
// 累加
for (i = 2; i <= a; i++)
{
for (j = 1; j <= b; j++)
{
if (map[i][j])
map[i][j] = map[i - 1][j] + 1;
}
}
// 下面的过程和 hduoj 1505 一样了
// 遍历每一行
max = -1;
for (i = 1; i <= a; i++)
{
for (j = 1; j <= b; j++)
l[j] = r[j] = j;
// 向左
for (j = 2; j <= b; j++)
{
while (l[j] - 1 > 0 && map[i][j] <= map[i][l[j] - 1])
l[j] = l[l[j] - 1];
}
// 向右
for (j = b - 1; j >= 1; j--)
{
while (r[j] < b && map[i][j] <= map[i][r[j] + 1])
r[j] = r[r[j] + 1];
}
for (j = 1; j <= b; j++)
max = max > (map[i][j] * (r[j] - l[j] + 1)) ? max : (map[i][j] * (r[j] - l[j] + 1));
}
max *= 3;
printf("%d\n", max);
}
return 0;
}