知识点:单调栈
11分钟过了这个题,但是这是洛谷少有的把难度给低的题目,这题算是01矩阵求最大子矩阵的模板题,我们的思路就是输入的时候做一下预处理,或者说是组织一下状态?对每个元素,如果是1,那么累加上面的元素,如果是0,那么它的累加数组也是0,这样就变成了n行,n个一维的求最大子矩阵的问题,这个问题用单调栈昨天已经练习的很熟练了,主要是这个01矩阵求最大子矩阵(全1)的状态的组织方法要好好理解一下,
#include <bits/stdc++.h>
using namespace std;
const int N = 1005;
int main() {
int n, m;
cin >> n >> m;
int a[N][N], b[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 (a[i][j]) b[i][j] = b[i - 1][j] + a[i][j];
else b[i][j] = 0;
}
}
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() && b[i][j] < b[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() && b[i][j] < b[i][s2.top()]) {
L[s2.top()] = j;
s2.pop();
}
s2.push(j);
}
for (int j = 1; j <= m; j++) {
ans = max(ans, b[i][j] * (R[j] - L[j] - 1));
}
}
cout << ans * 3;
return 0;
}