标签:
大致了看上次写的LIS的nlogn写法,基本上吃透了,就是设一个数组d,d[i]表示的上升子序列为i的时候最小的
原序列值,比如序列1 4 3 5 2 3的d[3]就是3,表示上升子序列为3的时候序列最大值的最小值是3。然后对每个
数二分查找。之前我写那道里面写的挺详细的,不再细说了。
代码:
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<vector> #include<set> #include<string> #include<algorithm> #define MAX 0x7fffffff using namespace std; int a[100005]; int d[100005]; int main() { int n,i,j,len; while(cin >> n) { for(i=1; i<=n; i++) scanf("%d",&a[i]); d[1] = a[1]; len = 1; for(i=2; i<=n; i++) { *lower_bound(d+1,d+len+1,a[i]) = a[i]; if(lower_bound(d+1,d+len+1,a[i]) == d+len+1) len = len+1; } cout << len << endl; } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
poj 3903 Stock Exchange 最长上升子序列
标签:
原文地址:http://blog.csdn.net/sinat_22659021/article/details/48103045