HDU 1505

来源:互联网 发布:破壁机有用吗 知乎 编辑:程序博客网 时间:2024/06/05 02:19
#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的啊,这让人还是很郁闷的。
0 0
原创粉丝点击