最大连通矩形面积

算法地址:http://www.csie.ntnu.edu.tw/~u91029/MaximumSubarray.html#2

题目连接:https://vjudge.net/contest/170761#problem/B

代码:

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
using namespace std;
const int maxn=200+20;
int arr[maxn][maxn];
int wl[maxn];//向左能延长的最长长度 
int wr[maxn];//向右能延长的最长长度 
int h[maxn];//能延长的最高高度 
int l[maxn];//向上到边界,能向左延长的最大长度 
int r[maxn];//向上到边界,能向右延长的最大长度 
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n,m;
        memset(wl,0,sizeof(wl));
        memset(h,0,sizeof(h));
        memset(wr,0,sizeof(wr));
        memset(r,0,sizeof(r));
        memset(l,0,sizeof(l));
        scanf("%d %d",&n,&m);
        for(int i=0;i<=n+1;i++) arr[i][0]=0;
        for(int i=0;i<=n+1;i++) arr[0][i]=0;
        for(int i=0;i<=n+1;i++) arr[n+1][i]=0;
        for(int i=0;i<=n+1;i++) arr[i][n+1]=0;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++) arr[i][j]=1;
        }
        for(int i=1;i<=m;i++)
        {
            int r1,l1,r2,l2;
            scanf("%d %d %d %d",&r1,&l1,&r2,&l2);
            for(int i=r1;i<=r2;i++)
            {
                for(int j=l1;j<=l2;j++)
                {
                    arr[i][j]=0;
                }
            }
        }
        /*for(int i=0;i<=n+1;i++)
        {
            for(int j=0;j<=n+1;j++)
            {
                cout<<arr[i][j]<<" ";
            }
            cout<<endl;
        }*/
        int mx=0;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(arr[i][j]) wl[j]=wl[j-1]+1;
                else wl[j]=0;
            }
            for(int j=n;j>=1;j--)
            {
                if(arr[i][j]) wr[j]=wr[j+1]+1;
                else wr[j]=0;
            }
            for(int j=1;j<=n;j++)
            {
                if(arr[i][j]) h[j]=h[j]+1;
                else h[j]=0;
            }
            for(int j=1;j<=n;j++)
            {
                if(r[j]==0) r[j]=wr[j];
                else r[j]=min(r[j],wr[j]);
            }
            for(int j=1;j<=n;j++)
            {
                if(l[j]==0) l[j]=wl[j];
                else l[j]=min(l[j],wl[j]);
            }
            for(int j=1;j<=n;j++)
            {
                mx=max(mx,(r[j]+l[j]-1)*h[j]);
            }
        }
        cout<<mx<<endl;
    }
    return 0;
}

 

posted on 2017-07-15 23:17  chinacwj1  阅读(282)  评论(0编辑  收藏  举报

导航