hdu 2870 Largest Submatrix

hdu1505/hdu1506最大子矩阵

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
/*ashione 2012-4-24
最大子矩阵变形,枚举a,b,c即可。
l,r的最大距离操作参照hdu1505.
*/
#define MAXN 1005
char str[MAXN][MAXN];
char fun[]={'a','b','c','w','x','y','z'};
int d[8][4]={{1,0,0},{0,1,0},{0,0,1},{1,1,0},{0,1,1},{1,0,1},{1,1,1}};
int num[2][4][MAXN],r[MAXN],l[MAXN];
int main(){
        int n,m,i,j,k,t;
        while(~scanf("%d %d",&n,&m)){

                for(i=1;i<=n;i++)
                        scanf("%s",str[i]+1);
                int answer=0;
                memset(num,0,sizeof(num));
                for(i=1;i<=n;i++){
                        int p=i&1;
                        
                        for(j=1;j<=m;j++){
                                for(k=0;k<7;k++){
                                        if(str[i][j] == fun[k]){
                                                for(t=0;t<3;t++){
                                                        if(d[k][t])
                                                                num[p][t][j]=num[!p][t][j]+1;
                                                        else
                                                                num[p][t][j]=0;
                                                }
                                                break;
                                        }

                                }
                        }
                        for(k=0;k<3;k++){
                                for(t=1;t<=m;t++)
                                        l[t]= r[t]=t;
                                for(j=1;j<=m;j++)
                                {
                                        while(l[j]-1>=1 && num[p][k][l[j]-1]>=num[p][k][j])
                                                l[j]=l[l[j]-1];
                                }
                                
                                for(j=m;j>=1;j--)
                                {
                                        while(r[j]+1<=m && num[p][k][r[j]+1]>=num[p][k][j])
                                                r[j]=r[r[j]+1];
                                }
                                for(j=1;j<=m;j++)
                                {
                                        int temp=num[p][k][j]*(r[j]-l[j]+1);
                                        if(answer<temp)
                                                answer=temp;
                                }
                        }

                }
                cout<<answer<<endl;
        }
        return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值