题目:https://www.luogu.org/problemnew/show/P4147
悬线法裸题。
注意那个更新r的时候;r的意义是高为当前悬线的那一条最右能扩展到哪,故当与上一行无关时就不应受它的影响了;
l 因为是取Max,所以没有上述顾虑,即不合法的上一行只会是 ‘R’ ,而它的值是0,所以取Max的时候不会受无关状态的影响。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N=1005; int n,m,u[N][N],l[N][N],r[N][N],ans; char cch[N]; int main() { scanf("%d%d",&n,&m); memset(r[0],1,sizeof r[0]); char ch; for(int i=1;i<=n;i++) { int k=1; for(int j=1;j<=m;j++) { scanf(" %c",&cch[j]); if(cch[j]=='F') { u[i][j]=u[i-1][j]+1; l[i][j]=max(l[i-1][j],k); } else k=j+1; } k=m; for(int j=m;j;j--) { if(cch[j]=='F')r[i][j]=(u[i][j]>1)?min(r[i-1][j],k):k;// else k=j-1; ans=max(ans,(r[i][j]-l[i][j]+1)*u[i][j]); } // for(int j=1;j<=m;j++) // printf("j=%d u=%d l=%d r=%d ",j,u[i][j],l[i][j],r[i][j]); } printf("%d",ans*3); return 0; }