HDU 1505

#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;

const int maxn=1010;
int d[maxn][maxn];
int l[maxn],r[maxn];
int t,a,b;
char c[2];
int maxs;
int main()
{

    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&a,&b);
        memset(d,0,sizeof(d));
        maxs=0;
        for(int i=0;i<a;i++)
        {
            for(int j=0;j<b;j++)
            {
               scanf("%s",c);
               if(c[0]=='F')
                d[i][j]=1;
            }
        }
       /* for(int i=0;i<a;i++)
        {
            for(int j=0;j<b;j++)
                printf("%d   ",d[i][j]);
            printf("\n");
        }*/
        for(int i=1;i<a;i++)
        {
            for(int j=0;j<b;j++)
            {
                if(d[i][j]!=0)
                d[i][j]=d[i-1][j]+1;
            }
        }
        for(int i=0;i<a;i++)
        {
            for(int j=0;j<b;j++)
            {
               l[j]=j;
               while(l[j]>0&&d[i][l[j]-1]>=d[i][j]) l[j]=l[l[j]-1];
            }
            for(int j=b-1;j>-1;j--)
            {
                r[j]=j;
               while(r[j]<b-1&&d[i][r[j]+1]>=d[i][j]) r[j]=r[r[j]+1];
            }
            for(int j=0;j<b;j++)
            {
                if(maxs<((r[j]-l[j]+1)*d[i][j])) maxs=(r[j]-l[j]+1)*d[i][j];
            }

        }
        printf("%d\n",maxs*3);

    }

    return 0;
}
这个其实不是什么常见的DP问题了,这个是在求最大高度的左右边的时候也用了一个状态转移函数。
l[j]=l[l[j]-1];
r[j]=r[r[j]-1];
这个比较的难想到,其实这个题目的解题方法本身就是比较新颖的,一开始不一定可以想的到啊。
这个题目还需要注意的是要记得每次算完了一层i的l和r后要做一次求maxs。
然后在一开始读取数据的时候要记得小心,这种题目经常会在这里翻车,用scanf("%c",&c);加上各种getchar();这种读法的时候还是会WA的啊,这让人还是很郁闷的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值