对矩阵进行压缩
然后爆搜即可
或者1506升级版 最大子矩阵
PS: 此题输入是个坑。。。。。。注意DISCUSS吧
暴力:
#include "stdio.h"
#include "string.h"
#include "math.h"
int a[1010][1010],sum[1010][1010];
char str[10010];
int main()
{
int t,n,m,i,j,k,ans,min;
char ch;
scanf("%d",&t);
while (t--)
{
scanf("%d%d",&n,&m);
getchar();
memset(a,0,sizeof(a));
k=0;
while (k!=n*m)
{
scanf("%c",&ch);
if (ch=='F')
{
a[k/m][k%m]=1;
k++;
}
if (ch=='R')
{
a[k/m][k%m]=0;
k++;
}
}
/* for (i=0;i<n;i++)
{
for (j=0;j<m;j++)
printf("%d ",a[i][j]);
printf("\n");
}*/
memset(sum,0,sizeof(sum));
for (i=0;i<n;i++)
for (j=0;j<m;j++)
if (a[i][j]==1)
sum[i][j]=sum[i][j-1]+1;
else
sum[i][j]=0;
ans=0;
for (i=0;i<m;i++)
for (j=0;j<n;j++)
{
min=1010;
for (k=j;k<n;k++)
if (sum[k][i]==0) break;
else
{
if (sum[k][i]<min) min=sum[k][i];
if (min*(k-j+1)>ans) ans=min*(k-j+1);
}
}
printf("%d\n",ans*3);
}
return 0;
}
DP:
#include "stdio.h"
#include "string.h"
int sum[1010][1010],a[1010][1010];
int max(int a,int b){if (a<b)return b;else return a;}
int main()
{
int Case,n,m,ans,i,j,k;
char str[3001],ch;
int le[1010],ri[1010];
scanf("%d",&Case);
while (Case--)
{
scanf("%d%d",&n,&m);
getchar();
memset(a,-1,sizeof(a));
k=0;
while (k!=n*m)
{
scanf("%c",&ch);
if (ch=='F')
{
a[k/m+1][k%m+1]=1;
k++;
}
if (ch=='R')
{
a[k/m+1][k%m+1]=0;
k++;
}
}
memset(sum,0,sizeof(sum));
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
if (a[i][j]!=0) sum[i][j]=sum[i][j-1]+1;
ans=0;
for (j=1;j<=m;j++)
{
for (i=1;i<=n;i++)
le[i]=ri[i]=i;
for (i=1;i<=n;i++)
{
if (sum[i][j]==0) continue;
while (sum[i][j]<=sum[le[i]-1][j])
le[i]=le[le[i]-1];
}
for (i=n;i>=1;i--)
{
if (sum[i][j]==0)continue;
while (sum[i][j]<=sum[ri[i]+1][j])
ri[i]=ri[ri[i]+1];
}
for (i=1;i<=n;i++)
ans=max(ans,(ri[i]-le[i]+1)*sum[i][j]);
}
printf("%d\n",ans*3);
}
}