POJ 3494 Largest Submatrix of All 1’s(最大全1子矩阵)

题目链接:http://poj.org/problem?id=3494

题意:给出一个01的矩阵,找出一个面积最大的全1矩阵。

思路:用h[i][j]表示从位置(i,j)向上连续1的最大长度。之后枚举每一行。对于某行,对于该行的每列,预处理left[j]和right[j],left[j]表示j列向左可以到达的最左位置使得[left[j],j]的所有列的h值均大于等于h[i][j],right类似。之后枚举列,用(right[j]-left[j]+1)*h[i][j]更新答案。

 




int a[N][N],h[N][N];
int n,m;


int main()
{
    Rush(n)
    {
        RD(m);
        int i,j;
        FOR1(i,n) FOR1(j,m) RD(a[i][j]);
        FOR1(i,n) FOR1(j,m)
        {
            if(!a[i][j]) h[i][j]=0;
            else h[i][j]=h[i-1][j]+1;
        }
        int ans=0;
        int left[N],right[N];
        FOR1(i,n)
        {
            h[i][0]=h[i][m+1]=-1;
            FOR1(j,m) left[j]=right[j]=j;
            FOR1(j,m) 
            {
                while(h[i][j]<=h[i][left[j]-1]) left[j]=left[left[j]-1];
            }
            FORL1(j,m) 
            {
                while(h[i][j]<=h[i][right[j]+1]) right[j]=right[right[j]+1];
            }
            FOR1(j,m) upMax(ans,(right[j]-left[j]+1)*h[i][j]);
        }
        PR(ans);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值