先來無事,切道水題。
題目網址如下:http://cstest.scu.edu.cn/soj/problem.action?id=4150
最長遞增子序列的變種。
代碼如下:
- #include <stdio.h>
- #include <ctype.h>
- #include <string.h>
- #include <algorithm>
- using namespace std;
- inline bool get(int &t)
- {
- bool flag = 0 ;
- char c;
- while(!isdigit(c = getchar())&&c!='-') if( c == -1 ) break ;
- if( c == -1 ) return 0 ;
- if(c=='-') flag = 1 , t = 0 ;
- else t = c ^ 48;
- while(isdigit(c = getchar())) t = (t << 1) + (t << 3) + (c ^ 48) ;
- if(flag) t = -t ;
- return 1 ;
- }
- const int maxn = 101 ;
- int n , dp1[maxn] , a[maxn] ;
- inline void solve()
- {
- int i , j , k , w , x , y ;
- for( x = i = 0 ; i < n ; i++)
- {
- //[0,i]+[i,n-1]-1
- dp1[0] = 1 ;
- //cal dp1[i]。
- for( j =1 ; j <= i ; j++)
- {
- //cal dp1[j]
- for( w = 0 , k = j-1 ; k >= 0 ; k--)
- if( a[j] > a[k] && w < dp1[k] )
- w = dp1[k] ;
- dp1[j] = w + 1 ;
- }
- y = dp1[i] ;
- dp1[n-1] = 1 ;
- for( j = n-2 ; j >= i ; j--)
- {
- for( w = 0 , k = j+1 ; k < n ; k++)
- if( a[j] > a[k] && w < dp1[k] )
- w = dp1[k];
- dp1[j] = w + 1 ;
- }
- y += dp1[i] - 1 ;
- if( x < y ) x = y ;
- }
- printf("%d\n",n-x);
- }
- int main()
- {
- int i ;
- while(get(n))
- {
- for( i = 0 ; i < n ; i++) get(a[i]);
- solve();
- }
- }