zoj2136 Longest Ordered Subsequence(DP)
/*
单调队列优化的最大上升子序列 O(NlogN)算法
*/
View Code
1 #include <iostream>
2 #include <cstdlib>
3
4 using namespace std;
5
6 int data[ 1002 ];
7 int Queu[ 1002 ];
8
9 int BS( int tail, int key )
10 {
11 int l = 0,h = tail;
12 while ( l < h ) {
13 int m = (l+h)/2;
14 if ( Queu[ m ] > key )
15 h = m;
16 else l = m+1;
17 }
18 return l;
19 }
20
21 int main()
22 {
23 int t,n;
24 while ( cin >> t )
25 while ( t -- ) {
26 cin >> n;
27 for ( int i = 1 ; i <= n ; ++ i )
28 cin >> data[ i ];
29
30 int tail = 0;
31 Queu[ 0 ] = data[ 1 ];
32 for ( int i = 2 ; i <= n ; ++ i )
33 if ( data[ i ] > Queu[ tail ] )
34 Queu[ ++ tail ] = data[ i ];
35 else Queu[ BS( tail, data[ i ] ) ] = data[ i ];
36
37 cout << tail+1 << endl;
38 if ( t ) cout << endl;
39 }
40 return 0;
41 }

浙公网安备 33010602011771号