目前WA中,正在找错……
1 #include <cstdio> 2 3 const int MAXN = 1000 + 10; 4 const int INF = 2147483645; 5 6 double stack[MAXN]; 7 double height[MAXN]; 8 double reverse[MAXN]; 9 int n; 10 11 int Bsearch( int x, int y, double v ) 12 { 13 int m; 14 while ( x < y ) 15 { 16 m = ( x + y ) / 2; 17 if ( v > stack[ m - 1 ] && v <= stack[m] ) return m; 18 else if ( stack[m] > v ) y = m; 19 else x = m + 1; 20 } 21 return m; 22 } 23 24 int DP( int y, double *num ) //求到位置 y - 1 的最长上升子序列 25 { 26 int top = 0; 27 28 stack[ ++top ] = num[0]; 29 30 for ( int i = 1; i < y; i++ ) 31 { 32 if ( num[i] > stack[top] ) 33 stack[ ++top ] = num[i]; 34 else 35 { 36 int temp = Bsearch( 0, top, num[i] ); 37 if ( stack[temp] > num[i] ) stack[temp] = num[i]; 38 else stack[temp + 1] = num[i]; 39 } 40 } 41 42 return top; 43 } 44 45 int main() 46 { 47 while ( scanf("%d", &n) != EOF ) 48 { 49 for ( int i = 0; i < n; i++ ) 50 { 51 scanf( "%lf", &height[i] ); 52 reverse[n - 1 - i] = height[i]; //逆序存一下该数列,把求从左往右的递减序列问题 53 //转换为求从右往左的递增序列问题 54 } 55 56 int MIN = INF; 57 for ( int i = 0; i < n; i++ ) 58 { 59 int temp; 60 int ans1 = DP( i, height ); 61 int ans2 = DP( n - i, reverse ); 62 63 temp = n - ( ans1 + ans2 ); 64 65 // printf( "%d %d\n", ans1, ans2 ); 66 67 if ( temp < MIN ) MIN = temp; 68 } 69 70 printf( "%d\n", MIN ); 71 } 72 return 0; 73 }