空白最多的最大子矩阵:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn = 1005; int mat[maxn][maxn],up[maxn][maxn],left[maxn][maxn],right[maxn][maxn]; int main() { int t; scanf("%d",&t); while(t--){ int m,n; scanf("%d%d",&m,&n); for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ char ch=getchar(); while(ch!='F'&&ch!='R') ch=getchar(); mat[i][j] = ch=='F'?0:1; } } int ans=0; for(int i=0;i<m;i++){ int lo = -1,ro = n; for(int j=0;j<n;j++){ if(mat[i][j]==1){ up[i][j]=left[i][j]=0; lo = j; } else{ up[i][j]=i==0?1:up[i-1][j]+1; left[i][j]=i==0?lo+1:max(lo+1,left[i-1][j]); } } for(int j=n-1;j>=0;j--){ if(mat[i][j]==1){ right[i][j]=n; ro=j; } else{ right[i][j]=i==0?ro-1:min(ro-1,right[i-1][j]); int temp = up[i][j]*(right[i][j]-left[i][j]+1); ans=max(ans,temp); } } } printf("%d\n",ans*3); } return 0; }
原文地址:http://blog.csdn.net/u013382399/article/details/39054347