二维图中找最大子矩形的四道题

来源:互联网 发布:用数据说话的广告语 编辑:程序博客网 时间:2024/05/11 02:22

hdu 1506 直方图中找最大矩形

找出每个矩形以自己的高能延伸到的左右边界

#include<stdio.h>#include<string.h>#define maxn 100010int n;__int64 max;struct node{    int left,right;    __int64 num;}t[maxn];int main(){    int i,j,k,l;    while(scanf("%d",&n)&&n!=0)    {        max=-1;        for(i=0;i<n;i++)        {            scanf("%I64d",&t[i+1].num);            t[i+1].left=t[i+1].right=i+1;        }        t[0].num=-1;        t[n+1].num=-1;        for(i=1;i<=n;i++)        {            while(t[i].num<=t[ t[i].left-1 ].num)                t[i].left=t[ t[i].left -1 ].left;        }        for(i=n;i>=1;i--)        {            while(t[i].num<=t[ t[i].right+1 ].num)                t[i].right=t[ t[i].right+1 ].right;        }        for(i=1;i<=n;i++)        {            __int64 tmp=(t[i].right-t[i].left+1)*t[i].num;            if(tmp>max)                max=tmp;        }        printf("%I64d\n",max);    }    return 0;}
hdu 1505 二维图中找最大矩形

把每一行当做基线,同上题

#include<stdio.h>#include<string.h>#define maxn 1010char f[maxn][maxn];int s[maxn],max;struct node{int left,right,num;}num[maxn];int m,n;int main(){int i,j,k,l;scanf("%d",&l);while(l--){scanf("%d %d",&m,&n);for(i=0;i<m;i++){for(j=0;j<n;j++){scanf("%s",&f[i][j]);  //  %s过滤空格和回车}}max=0;for(i=0;i<m;i++){memset(num,-1,sizeof(num));memset(s,0,sizeof(s));for(j=1;j<=n;j++){for(k=i;k>=0;k--){if(f[k][j-1]=='F')s[j]++;elsebreak;}}for(j=0;j<=n+1;j++){num[j].left=j;num[j].right=j;num[j].num=s[j];}num[0].num=-1;num[n+1].num=-1;for(j=1;j<=n;j++){while(num[j].num<=num[ num[j].left-1 ].num )num[j].left=num[ num[j].left-1 ].left;}for(j=n;j>=1;j--){while(num[j].num<=num[ num[j].right+1].num )num[j].right=num[ num[j].right+1].right;}for(j=1;j<=n;j++){int tmp;tmp=(num[j].right-num[j].left+1)*num[j].num;if(tmp>max)max=tmp;}}printf("%d\n",max*3);}return 0;}
hdu 2870 Largest Submatrix

分别把w,x,y,z全部转化成a,b,c,再求各个图的最大矩形,同上题,代码略

hdu 2830 Matrix Swapping II

图中的列可以任意交换,求由1组成的最大矩形,分别把每一行当做直方图的基线,dp[i]存第i列的高,在对它升序排序,即可求出最大的矩形

#include<stdio.h>#include<string.h>#include<stdlib.h>#define maxn 1015int n,m,max;char ma[maxn][maxn];int map[maxn][maxn];int dp[maxn];int cmp(const void*a,const void*b){    //return *(int*)a>*(int*)b?1:-1;    return *(int*)a-*(int*)b;}int main(){    int i,j,k,l;    while(~scanf("%d %d",&n,&m)&&n&&m)    {        for(i=0;i<n;i++)        {            scanf("%s",&ma[i]);        }        memset(map,0,sizeof(map));                for(i=0;i<n;i++)        {            for(j=0;j<m;j++)                if(ma[i][j]=='1')                    map[i][j]=1;        }        max=-1;        int tmp;        for(i=0;i<n;i++)        {            memset(dp,0,sizeof(dp));            for(j=0;j<m;j++)            {                for(k=i;k>=0;k--)                {                    if(map[k][j]==1)                        dp[j]++;                    else                        break;                }            }            qsort(dp,m,sizeof(int),cmp);            for(l=0;l<m;l++)            {                tmp=dp[l]*(m-l);                if(tmp>max)                    max=tmp;            }        }        printf("%d\n",max);    }    return 0;}





原创粉丝点击