HDU1506+DP

 1 /*

 2 用线段树不会写

 3 

 4 dp

 5 l[ i ]:表示左边>=h[i]的位置pos

 6 */

 7 #include<stdio.h>

 8 #include<algorithm>

 9 using namespace std;

10 typedef long long int64;

11 const int maxn = 100005;

12 int64 h[ maxn ],l[ maxn ],r[ maxn ];

13 int main(){

14     int n;

15     while( scanf("%d",&n)==1 ){

16         if( n==0 ) break;

17         for( int i=1;i<=n;i++ ){

18             scanf("%I64d",&h[i]);

19             l[ i ] = i;

20             r[ i ] = i;

21         }

22         for( int i=2;i<=n;i++ ){

23             while( l[ i ]>1 && h[ l[i]-1 ]>=h[ i ] ){

24                 l[ i ] = l[ l[ i ]-1 ];//dp

25                 //printf("i=%d\n",i);

26             }

27         }

28         for( int i=n-1;i>=1;i-- ){

29             while( r[ i ]<n && h[ r[i]+1 ]>=h[ i ] ){

30                 r[ i ] = r[ r[ i ]+1 ];

31             }

32         }

33         int64 res = 0;

34         for( int i=1;i<=n;i++ ){

35             res = max( res,(r[ i ]-l[ i ]+1)*h[ i ] );

36         }

37         printf("%I64d\n",res);

38     }

39     return 0;

40 }
View Code

但是不知道用线段树怎么来标记计算。。。

你可能感兴趣的:(HDU)