HDU 2870 Largest Submatrix(最大完全子矩阵之不可移动列)

来源:互联网 发布:惠州世联地产 知乎 编辑:程序博客网 时间:2024/05/16 02:56

题目链接:Click here~~

题意:

和HDU 2830类似,只是这次不能再将列任意移动,于是题目完全变成了求最大长方形那道题。

解题思路:

只说如何求最大长方形,我的思路是枚举每个高度,然后以它做基准,向左向右扩张,扩张条件是h[i-k]>=h[k]、h[i+k]>=h[k]。记录扩张的个数即可。

没想到这题竟然进rank了,好高兴。话说我都没用传说中的单调队列呢。

#include <stdio.h>#include <string.h>#define N 1002#define min(a,b) a < b ? a : bbool Check(char std,char c){    if(std == 'a')        return c=='a' || c=='w' || c=='y' || c=='z';    if(std == 'b')        return c=='b' || c=='w' || c=='x' || c=='z';    if(std == 'c')        return c=='c' || c=='x' || c=='y' || c=='z';}int main(){    int R,C,num[N];    char w[N][N];    while(~scanf("%d%d",&R,&C))    {        int ans = 0;        for(int i=0;i<R;i++)            scanf("%s",w[i]);        for(char c='a';c<='c';c++)        {            memset(num,0,sizeof(num));            for(int i=0;i<R;i++)            {                for(int j=0;j<C;j++)                {                    if(Check(c,w[i][j]))                        ++num[j];                    else                        num[j] = 0;                }                for(int j=0;j<C;j++)                {                    if(!num[j])                        continue;                    int cnt = 1;                    for(int k=1;j-k>0 && num[j-k]>=num[j];k++)                        ++cnt;                    for(int k=1;j+k<C && num[j+k]>=num[j];k++)                        ++cnt;                    if(num[j]*cnt > ans)                        ans = num[j]*cnt;                }            }        }        printf("%d\n",ans);    }    return 0;}


原创粉丝点击