Lis 最长递增子序列
时间复杂度:n*log n
View Code
#include <cstdio> #include <cstring> #include <iostream> using namespace std; const int maxn = 50005; int dp[maxn] , a[maxn]; int Lis(int n) { int len = 1 , left , right , mid; dp[1] = a[1]; for(int i=2;i<=n;i++) { left = 1; right = len; while(left <= right) { mid = (left + right) / 2; if(a[i] > dp[mid]) left = mid + 1; else right = mid - 1; } dp[left] = a[i]; if(left > len) len = left; } return len; } int main() { int n , cas = 1; while(~scanf("%d",&n)) { for(int i=1;i<=n;i++) scanf("%d",a+i); int ans = Lis(n); printf("%d\n",ans); } return 0; }