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 }

你可能感兴趣的:(poj)