soj4150

先來無事,切道水題。

題目網址如下:http://cstest.scu.edu.cn/soj/problem.action?id=4150

最長遞增子序列的變種。

代碼如下:

 

  1. #include <stdio.h>  
  2. #include <ctype.h>  
  3. #include <string.h>  
  4. #include <algorithm>  
  5.  
  6. using namespace std;  
  7.  
  8. inline bool get(int &t)  
  9. {  
  10.     bool flag = 0 ;  
  11.     char c;  
  12.     while(!isdigit(c = getchar())&&c!='-'if( c == -1 ) break ;  
  13.     if( c == -1 ) return 0 ;  
  14.     if(c=='-') flag = 1 , t = 0 ;  
  15.     else t = c ^ 48;  
  16.     while(isdigit(c = getchar()))    t = (t << 1) + (t << 3) + (c ^ 48) ;  
  17.     if(flag) t = -t ;  
  18.     return 1 ;  
  19. }  
  20.  
  21. const int maxn = 101 ;  
  22. int n , dp1[maxn] , a[maxn] ;  
  23.  
  24. inline void solve()  
  25. {  
  26.     int i , j , k , w , x , y ;  
  27.     for( x = i = 0 ; i < n ; i++)  
  28.     {  
  29.         //[0,i]+[i,n-1]-1  
  30.         dp1[0] = 1 ;  
  31.         //cal dp1[i]。  
  32.         for( j =1 ; j <= i ; j++)  
  33.         {  
  34.             //cal dp1[j]  
  35.             for( w = 0 , k = j-1 ; k >= 0 ; k--)  
  36.                 if( a[j] > a[k] && w < dp1[k] )  
  37.                     w = dp1[k] ;  
  38.             dp1[j] = w + 1 ;  
  39.         }  
  40.         y = dp1[i] ;  
  41.         dp1[n-1] = 1 ;  
  42.         for( j = n-2 ; j >= i ; j--)  
  43.         {  
  44.             for( w = 0 , k = j+1 ; k < n ; k++)  
  45.                 if( a[j] > a[k] && w < dp1[k] )  
  46.                     w = dp1[k];  
  47.             dp1[j] = w + 1 ;  
  48.         }  
  49.         y += dp1[i] - 1 ;  
  50.         if( x < y ) x = y ;  
  51.     }  
  52.     printf("%d\n",n-x);  
  53. }  
  54.  
  55. int main()  
  56. {  
  57.     int i ;  
  58.     while(get(n))  
  59.     {  
  60.         for( i = 0 ; i < n ; i++) get(a[i]);  
  61.         solve();  
  62.     }  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章