此题要求最大子矩阵:并且子矩阵要全为F;
本题类似hdu 1506 ;
对每一行,求出含有F的高度,然后对这一行求最大面积和(相当于1506)
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int height[1111][1111]; int r[1111][1111],l[1111][1111]; int main() { int i,j,k,m,n,b; char s[11]; int t; cin>>t; while(t--) { cin>>m>>n; memset(height,0,sizeof(height)); int ans=0; int sum; for(i=1; i<=m; i++) { for(j=1; j<=n; j++) { scanf("%s",s); if(s[0]=='F') height[i][j]=height[i-1][j]+1; else if(s[0]=='R') height[i][j]=0; r[i][j]=l[i][j]=j; } } i=1; for(i=1; i<=m; i++) { for(j=2;j<=n;j++) { k=j; while(k>1&&height[i][k]<=height[i][k-1]) { k=l[i][k-1]; } l[i][j]=k; } for(j=n-1;j>=1;j--) { k=j; while(k<n&&height[i][k]<=height[i][k+1]) { k=r[i][k+1]; } r[i][j]=k; } sum=0; for(j=1;j<=n;j++) { b=height[i][j]*(r[i][j]-l[i][j]+1); if(sum<b) sum=b; } if(sum>ans) ans=sum; } cout<<3*ans<<endl; } return 0; }