• HDU 1506 Largest Rectangle in a Histogram


    这个问题姑且也叫做最大子矩阵吧

    给一个树状图,求一个最大面积的子矩阵

    思路是这样的,对于每个单位矩阵,求出左边连续不比它低的矩阵的下标,放在l数组里

    同样,再求出右边连续的不比它低的矩阵的下标

    这样,对于每个单个矩阵所能得到的最大面积就是 (r[i]-l[i]+1)*a[i]

     1 //#define LOCAL
     2 #include <iostream>
     3 #include <cstdio>
     4 #include <cstring>
     5 using namespace std;
     6 
     7 const int maxn = 100000 + 5;
     8 long long a[maxn], l[maxn], r[maxn];
     9 
    10 int main(void)
    11 {
    12     #ifdef LOCAL
    13         freopen("1506in.txt", "r", stdin);
    14     #endif
    15 
    16     long long n;
    17     while(scanf("%I64d", &n) == 1 && n)
    18     {
    19         long long ans = -1;
    20         long long i, t;
    21         for(i = 1; i <= n; ++i)
    22             scanf("%I64d", &a[i]);
    23         l[1] = 1;
    24         r[n] = n;
    25         for(i = 2; i <= n; ++i)
    26         {
    27             t = i;
    28             while(t > 1 && a[i] <= a[t-1])
    29                 t = l[t-1];
    30             l[i] = t;
    31         }
    32         for(i = n-1; i > 0; --i)
    33         {
    34             t = i;
    35             while(t < n && a[i] <= a[t+1])
    36                 t = r[t+1];
    37             r[i] = t;
    38         }
    39         long long temp;
    40         for(i = 1; i <= n; ++i)
    41         {
    42             temp = (r[i]-l[i]+1)*a[i];
    43             ans = max(ans, temp);
    44         }
    45         printf("%I64d
    ", ans);
    46     }
    47     return 0;
    48 }
    代码君
  • 相关阅读:
    信息收集-DNS
    Xshell下载
    JSP
    本地网络配置
    P1485 火枪打怪
    P4155 [SCOI2015]国旗计划
    P1017 [NOIP2000 提高组] 进制转换
    P1013 [NOIP1998 提高组] 进制位
    P1011 [NOIP1998 提高组] 车站
    CF841B Godsend
  • 原文地址:https://www.cnblogs.com/AOQNRMGYXLMV/p/3876060.html
Copyright © 2020-2023  润新知