求最大完全矩形的基本思想就是以每一行作为底,因为任意列可以调用,我们记录当前行为底的时候以某一个点的高度,然后排序,从大到小的排序,然后扫描到后面每一个点的高度为矩形高度的最大矩形面积就是h[i]*i
具体步骤如下:
很好的思路
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAX 1007
using namespace std;
int n,m;
char s[MAX];
int h[MAX];
int num[MAX];
int main ( )
{
while ( ~scanf ( "%d%d" , &n , &m ) )
{
int ans = 0;
memset ( h , 0 ,sizeof ( h ) );
for ( int i = 1 ; i <= n ; i++ )
{
scanf ( "%s" , s+1 );
for ( int j = 1 ; j <= m ; j++ )
{
if ( s[j] == '1' ) h[j]++;
else h[j] = 0;
num[j] = h[j];
}
sort ( num+1 , num+m+1 );
int j;
for ( int j =m ; j >= 1 ; j-- )
ans = max ( ans , num[j]*(m-j+1) );
}
printf ( "%d\n" , ans );
}
}