hdu 2870 Largest Submatrix

http://acm.hdu.edu.cn/showproblem.php?pid=2870

和1506 和1505类似的解法

一个关键的优化就是

if(!num[j])  
continue;

说实话不是想不到,关键是懒的加,因为看起来不可能优化多少

现在知道了,以后能优化的尽量优化,

这个不加就是超时与不超时的关系

代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <queue>
#define max(a,b) a>b?a:b
using namespace std;
char matrix[1010][1010];
int check(char a,char ans)
{
    if(ans=='a'&&(a=='w'||a=='y'||a=='a'||a=='z'))
    return 1;
    if(ans=='b'&&(a=='w'||a=='x'||a=='b'||a=='z'))
    return 1;
    if(ans=='c'&&(a=='x'||a=='y'||a=='c'||a=='z'))
    return 1;
    return 0;
}
int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)==2)
    {
        int num[1010]={0};
        int l[1010]={0};
        int r[1010]={0};
        for(int i=1;i<=n;i++)
        scanf("%s",matrix[i]+1);
        int maxn=0;
        for(char a='a';a<='c';a++)
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                l[j]=r[j]=j;
            }
            for(int j=1;j<=m;j++)
            {
                    if(check(matrix[i][j],a))
                    num[j]++;
                    else
                    num[j]=0;
            }
            for(int j=1;j<=m;j++)
            {
                if(!num[j])  
                continue;  
                while(l[j]-1>0&&num[l[j]-1]>=num[j])
                l[j]=l[l[j]-1];
                while(r[j]+1<=m&&num[r[j]+1]>=num[j])
                r[j]=r[r[j]+1];
                maxn=max((r[j]-l[j]+1)*num[j],maxn);
            }
        }
        printf("%d\n",maxn);
    }
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值