POJ 1836 Alignment

目前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 }
原文地址:https://www.cnblogs.com/GBRgbr/p/2615816.html