hdu 1950 最长上升子序列 动态规划

hdu 1950 最长上升子序列

动态规划 LIS nlogn 做法 采用而二分来优化

 1 #include <cstdio>
 2 #include <cmath>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <string>
 6 #include <algorithm>
 7 #include <iomanip>
 8 #include <iostream>
 9 using namespace std ;
10 
11 const int maxn = 40011 ;
12 int a[maxn],ans[maxn] ;
13 int n,t,len,pos ;
14 
15 int main() 
16 {
17     scanf("%d",&t) ;
18     while(t--) 
19     {
20         scanf("%d",&n) ;
21         for(int i=1;i<=n;i++) 
22             scanf("%d",&a[ i ]) ;
23         len = 1 ;
24         ans[ 1 ] = a[ 1 ] ;
25         for(int i=2;i<=n;i++) 
26             if(a[i]>ans[len]) ans[++len] = a[ i ] ;
27             else
28             {
29                 pos = lower_bound( ans+1,ans+len+1-1,a[ i ] ) - ans   ;      //
30                 //pos = lower_bound( ans,ans+len,a[ i ] ) - ans   ; 
31                 ans[ pos ] = a[ i ] ;
32             }
33         printf("%d
",len ) ; 
34     }
35     return 0 ;
36 }
原文地址:https://www.cnblogs.com/third2333/p/6856331.html