这好像是一道悬线法的题目,但是我不会,只能用单调栈水过了
我们将 a i , j a_{i,j} ai,j定义为从 ( i , j ) (i,j) (i,j)出发向上(坐标减小)可以达到的最长的、没有R的路径
比如说样例
5 6
R F F F F F
F F F F F F
R R R F F F
F F F F F F
F F F F F F
中的 a a a数组对应如下:
0 1 1 1 1 1
1 2 2 2 2 2
0 0 0 3 3 3
1 1 1 4 4 4
2 2 2 5 5 5
然后一行一行枚举,把每一行的
a
a
a往这道题上套
完毕。
#include<cstdio>
#include<cctype>
#include<stack>
#include<algorithm>
using namespace std;
int a[1100][1100];
struct rect
{
int h,w;
};
int main()
{
int n,m;scanf("%d%d",&n,&m);
char c;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
while(isspace(c=getchar()));
a[i][j]=c=='R'?0:a[i-1][j]+1;
}
m++;
int ans=0;
for(int i=1;i<=n;i++)
{
stack<rect>q;
int w;
for(int j=1;j<=m;j++)
{
w=0;
while(q.size()&&q.top().h>a[i][j])ans=max(ans,q.top().h*(w+=q.top().w)),q.pop();
q.push((rect){a[i][j],w+1});
}
}
printf("%d",3*ans);
return 0;
}