[Solution]
This is a classic DP which I didn't know until now. Consider the edges of the square must be stuck on a specific tile of 'R'. Let l[i][j] and r[i][j] be the most left and right position that tile(i, j) can reach. For each line, it must be single changing. And the whole problem can be solved in O(n^2) of time.
[Code]
#include <cstdio>
#include <memory.h>
#include <algorithm>
using namespace std;
const int maxn = 1009;
int fl[maxn][maxn], fr[maxn][maxn], h, n, m, ans;
bool a[maxn][maxn];
inline char nextLetter() {
int c;
do
c = getchar();
while ((c ^ 'R') && (c ^ 'F'));
return c;
}
int main() {
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif
memset(a, 0, sizeof(a));
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= m; j ++)
a[i][j] = (nextLetter() == 'F');
for (int i = 1; i <= n; i ++) {
fl[i][0] = 0;
for (int j = 1; j <= m; j ++)
if (a[i][j])
fl[i][j] = fl[i][j - 1];
else
fl[i][j] = j;
fr[i][m + 1] = m + 1;
for (int j = m; j; j --)
if (a[i][j])
fr[i][j] = fr[i][j + 1];
else
fr[i][j] = j;
}
ans = 0;
for (int j = 1; j <= m; j ++) {
int h = 0, l = 1, r = m;
for (int i = 1; i <= n; i ++)
if (a[i][j]) {
h ++;
l = max(l, fl[i][j] + 1);
r = min(r, fr[i][j] - 1);
ans = max(ans, h * (r - l + 1));
}
else {
h = 0;
l = 1;
r = n;
}
}
printf("%d\n", ans * 3);
}