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 }
但是不知道用线段树怎么来标记计算。。。
keep moving...