zoukankan      html  css  js  c++  java
  • hdu 1506(dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1506

    大意:求一个最大的区域,则第i个矩形对应的面积是ave[i] = (r[i] - l[i] + 1) * a[i];l[i]表示以它这个高度所能到达的最左边的位置(最左一个高度不小于它的高度的位置),而r[i]表示能到达的最右边的位置(最右一个高度不小于它的高度的位置)。

    这道题实际上就是对于任意数x求大于等于x的最左数的下标和最右数的下标;直接进行迭代就行;

    View Code
     1 #include<iostream>
     2 #include<algorithm>
     3 const int N=110000;
     4 using namespace std;
     5 __int64 h[N],l[N],r[N];
     6 
     7 int main(){
     8     int n;
     9     while(scanf("%d",&n)!=EOF){
    10         if(n==0)break;
    11         for(int i=1;i<=n;i++){
    12             scanf("%I64d",&h[i]);
    13             l[i]=r[i]=i;
    14         }
    15         h[0]=h[n+1]=-1;
    16         for(int i=1;i<=n;i++){
    17             while(h[l[i]-1]>=h[i])
    18                 l[i]=l[l[i]-1];
    19         }
    20         for(int i=n;i>=1;i--){
    21             while(h[r[i]+1]>=h[i])
    22                 r[i]=r[r[i]+1];
    23         }
    24         __int64 Max=0,ans=0;
    25         for(int i=1;i<=n;i++){
    26             ans=(r[i]-l[i]+1)*h[i];
    27             Max=max(ans,Max);
    28         }
    29         printf("%I64d\n",Max);
    30     }
    31     return 0;
    32 }
  • 相关阅读:
    单位
    北京户口
    中科院助理工程师
    SQL学习
    question
    ROI选取过程
    IT学习网站
    撞库 拖库
    善用人类记忆的特点去高效学习
    为什么散步对健康很有益处
  • 原文地址:https://www.cnblogs.com/wally/p/2952612.html
Copyright © 2011-2022 走看看