知识点:单调栈
这个题算是很经典的单调栈的应用了,通过状态组织预处理一下,使用单调栈可以线性时间内解决这个问题,但是由于单调栈的特性,也只限定于这种01矩阵才行,花了19分钟过了这个题,有点时间没写单调栈的题了,结果花了这么长的时间,后面一些程序的小细节,调了几分钟
#include <bits/stdc++.h>
using namespace std;
const int N = 1005;
int main() {
int T;
cin >> T;
while (T--) {
int n, m;
cin >> n >> m;
int a[N][N];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
char ch;
cin >> ch;
a[i][j] = (ch == 'F' ? 1 : 0);
if (i > 1 && a[i][j]) a[i][j] += a[i - 1][j];
}
}
int ans = 0;
for (int i = 1; i <= n; i++) {
int L[N], R[N];
fill(L + 1, L + m + 1, 0);
fill(R + 1, R + m + 1, m + 1);
stack<int> s1;
for (int j = 1; j <= m; j++) {
while (!s1.empty() && a[i][j] < a[i][s1.top()]) {
R[s1.top()] = j;
s1.pop();
}
s1.push(j);
}
stack<int> s2;
for (int j = m; j >= 1; j--) {
while (!s2.empty() && a[i][j] < a[i][s2.top()]) {
L[s2.top()] = j;
s2.pop();
}
s2.push(j);
}
for (int j = 1; j <= m; j++) {
ans = max(ans, a[i][j] * (R[j] - L[j] - 1));
}
}
cout << ans * 3 << endl;
}
return 0;
}