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 }

 

你可能感兴趣的:(HDU)