hdu 1505

来源:互联网 发布:乐外卖是什么软件 编辑:程序博客网 时间:2024/06/03 20:09

此题要求最大子矩阵:并且子矩阵要全为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;}

0 0
原创粉丝点击