zoukankan      html  css  js  c++  java
  • 最大连通矩形面积

    算法地址: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;
    }
  • 相关阅读:
    android SQLite使用
    蓝牙从搜索到成功配对的全过程
    vscode 开发.net core 从安装到部署 教程详解
    ServiceStack 简单服务搭建
    MongoDB 安装配置
    request.url 端口 错误
    Python 之 hello world
    .NET DateTime 源码学习
    Parallel.For 平行算法 使用
    Thread.Join 和 Task.Wait 方法
  • 原文地址:https://www.cnblogs.com/chinacwj/p/7188451.html
Copyright © 2011-2022 走看看