最大0,1子矩阵

 在一个0,1方阵中找出其中最大的全0子矩阵,所谓最大是指O的个数最多
 
一行一行的求,如果这行的第j个是1 , 这 h[j]++; 否则 h[j] = 0;
然后对求第一行到这行的最大全1矩阵。
例如这行的h值为 5 1 1 5 3 5      这最大全1矩阵的和应该为9。
求这个需要两个数组 l[], r[] 分别表示以h[j]为矩阵的高的左边界和有边界:
for(j = 0; j < m; j ++)
              {
                      l[j] = j;
                      while(l[j] > 0 && h[j] <= h[l[j] - 1])
                              l[j] = l[l[j] - 1];
              }
5 的左边界为    0
1 的左边界为1< 5, 1 的左边界肯定在5的左边界的左边 l[j] = l[l[j]–1]

 

 

 

 

#include  <iostream>
using namespace  std ;

#define 
MAXN  2010
int  h[MAXN],r[MAXN],l[MAXN];
int 
map[MAXN][MAXN];

char 
str[ 2 ] ;
int 
n,m ;

void 
all_0_matrix()
{
    
int  i,j,max  0 ;
    
memset(h, 0 , sizeof (h));

    for
(i  0 n i++)
    {
        
for (j  m j++)
        {
            
if (map[i][j]  ==  0 )
                h[j] ++;

            
else 
h[j]  0
        
}

          
        
for (j  0 m ++)
        {
            l[j] 
j ;
            while
(l[j]  && h[j] < h[l[j]  1 ])
                l[j] 
l[l[j]  1 ];
        

        
        
for (j  m- 1 > 0 j --)
        {
            r[j] 
j ;
            while
(r[j] m- && h[j] < = h[r[j]  1 ])
                r[j] 
r[r[j]  1 ] ;
        
}


        
for (j  0 m ++)
        {
            
if ((r[j] l[j]  1 h[j] max)
                max 
(r[j] l[j]  1 h[j];
        
}

    }
    printf(
"%dn" ,max) ;
}
int  main()
{
    
int  t, j, k, len  ;
    char 
ch ;
    while
(scanf( "%d" ,&n)! = EOF)
    {
        m
= n ;
        for
(i  0 n i++)
        {
            
for (j  0 m j++)
            {
               scanf(
"%d" ,&map[i][j])
            
}
        }
        all_0_matrix()
;
    
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值