hdu 2830 逐行扫描dp求最大完全矩形

来源:互联网 发布:mac chm阅读器 最好的 编辑:程序博客网 时间:2024/05/26 02:52

求最大完全矩形的基本思想就是以每一行作为底,因为任意列可以调用,我们记录当前行为底的时候以某一个点的高度,然后排序,从大到小的排序,然后扫描到后面每一个点的高度为矩形高度的最大矩形面积就是h[i]*i

具体步骤如下:

很好的思路

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#define MAX 1007using 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 );     }}


0 0
原创粉丝点击