• 最大连通矩形面积


    算法地址: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;
    }
  • 相关阅读:
    方便操作的命名范围scope
    使用Emmet加速Web前端开发
    Beanstalkd一个高性能分布式内存队列系统
    2000年互联网泡沫
    简单有效的kmp算法
    文本比较算法:计算文本的相似度
    字符串的四则运算
    文本比较算法:Needleman/Wunsch算法
    两则面试题(动态规划)
    文本比较算法:编辑距离
  • 原文地址:https://www.cnblogs.com/chinacwj/p/7188451.html
Copyright © 2020-2023  润新知