题意也很容易理解: 求最大子矩阵 R代表不能被使用,F代码可以使用。
嗯,算是1506的变形吧!
先计算下每一列的矩阵长度,然后按照1506来搞就可以了!
当然,还需要其它简单的控制。。。。。参照上篇blog!(强烈推荐……)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define NN 1010
#define Max(a,b) (a>b?a:b)
int map[NN][NN];
int l[NN],r[NN];
__int64 ans;
void dp(int cur,int n)
{
int i;
for(i=1;i<=n;i++){
l[i]=r[i]=i;
}
for(i=1;i<=n;i++){
while(map[cur][l[i]-1] >= map[cur][i])
l[i] = l[l[i]-1];
}
for(i=n;i>=1;i--){
while(map[cur][r[i]+1] >= map[cur][i])
r[i] = r[r[i]+1];
}
for(i=1;i<=n;i++){
ans = Max(ans,map[cur][i]*(r[i]-l[i]+1));
}
}
int main()
{
int t,n,m,i,j;
char s[2];
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)map[i][0]=-1;
map[n+1][0]=-2;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
scanf("%s",s);
if(s[0] == 'R'){
map[i][j] = 0;
map[i][0] = -2;
}
else map[i][j] = map[i-1][j] + 1;
}
map[i][j]= -1;
}
ans = 0;
for(j=1;j<=n;j++){
if(map[j+1][0] == -2){
dp(j,m);
}
}
printf("%I64d\n",ans*3);
}
return 0;
}