http://acm.hdu.edu.cn/showproblem.php?pid=1505
我的不知道为什么错:
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int k,m,n;
int a[1003][1003];
int L[1003][1003];
int R[1003][1003];
int main()
{
while(scanf("%d",&k)&&k)
{
int ans=0;
memset(a,0,sizeof(a));
scanf("%d %d",&m,&n);
int i,j;
for(i=1;i<=m;i++)
for(j=1;j<=m;j++)
{
char tmp[2];
scanf("%s",tmp);
if(strcmp(tmp,"R"))a[i][j]=0;
else a[i][j]=a[i-1][j]+1;
}
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
L[i][j]=j;
}
while(a[i][L[i][j]-1]>L[i][j]&&L[i][j]>0) L[i][j]=L[i][L[i][j]-1];
for(j=n;j>0;j--)
{
R[i][j]=j;
}
while(a[i][R[i][j]+1]>R[i][j]&&R[i][j]<n) R[i][j]=R[i][L[i][j]-1];
}
for(i=1;i<=m;i++)
{
int tmp=(R[i][i]-L[i][j]+1)*a[i][j];
ans=ans<tmp?tmp:ans;
}
printf("%d\n",ans);
}
return 0;
}
别人的:
#include<iostream>
using namespace std;
char grid[1001][1001];
int hi[1001][1001],l[1001][1001],r[1001][1001];//l[i][j],r[i][j],表示第[i,j]个方格的左右边界
int main()
{
int i,j,k,t,m,n,max;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&m,&n);
for(j=1;j<=n;j++)
hi[0][j]=0;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
{
cin>>grid[i][j];
if(grid[i][j]=='F')
hi[i][j]=hi[i-1][j]+1; //记录[i,j]的高度hi[i][j]
else if(grid[i][j]=='R')
hi[i][j]=0;
// cout<<hi[i][j]<<" ";
}
max=0;
for(i=1;i<=m;i++)
{
hi[i][0]=hi[i][n+1]=-1; //把最两端的高度置为-1,方便下面求左右边界
for(j=1;j<=n;j++)
{
k=j-1;
while(hi[i][k]>=hi[i][j])
k=l[i][k];
l[i][j]=k;
}
for(j=n;j>0;j--)
{
k=j+1;
while(hi[i][k]>=hi[i][j])
k=r[i][k];
r[i][j]=k;
}
for(j=1;j<=n;j++) //找最大面积
if((r[i][j]-l[i][j]-1)*hi[i][j]>max)
max=(r[i][j]-l[i][j]-1)*hi[i][j];
}
cout<<max*3<<endl;
}
return 0;
}