预处理h[i][j] 表示i j 位置向上最多到哪
l r表示向左向右。。
#include <iostream> #include <cstring> #include <string> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <queue> #include <map> #define inf 0x3f3f3f3f #define ll __int64 using namespace std; int h[1010][1010],r[1010][1010],l[1010][1010]; int main() { char s[5]; int t,i,j,ans,n,m; scanf("%d",&t); while(t--) { memset(h,0,sizeof h); scanf("%d%d",&n,&m); for(i=1;i<=n;i++) for(j=1;j<=m;j++) { scanf("%s",s); if(s[0]==‘F‘) h[i][j]=h[i-1][j]+1; } ans=-1; for(i=1;i<=n;i++) { h[i][0]=h[i][m+1]=-1;//这里要改成-1啊。。 for(j=1;j<=m;j++) l[i][j]=r[i][j]=j; for(j=2;j<=m;j++) { while(h[i][l[i][j]-1]>=h[i][j]) l[i][j]=l[i][l[i][j]-1]; } for(j=m-1;j>0;j--) { while(h[i][r[i][j]+1]>=h[i][j]) r[i][j]=r[i][r[i][j]+1]; } for(j=1;j<=m;j++) { if(h[i][j]*(r[i][j]-l[i][j]+1)>ans) ans=h[i][j]*(r[i][j]-l[i][j]+1); } } printf("%d\n",ans*3); } return 0; }
原文:http://blog.csdn.net/u011032846/article/details/19016659