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 }
原文地址:https://www.cnblogs.com/wally/p/2952612.html