不用DP,有点巧妙。
算法思想:维护一个单调递增的数组。
数组a[i]表示长度为i的子序列的最后一个元素是a[i].
当我们求最长子序列的时候,比方说,{1,3,5}和{1,3,4}这两个子序列长度都是3,但是4比5小所以4的适用范围比5要大,比方说{1,3,4,5}可以构成长度为4的子序列,而{1,3,5,5}却不行。
所以我们要尽可能的使最后一个元素小。
#include<iostream>
#include<stack>
#include<vector>
using namespace std;
int main(){
int n;
cin>>n;
vector<int> a;
int num;
int length=1;
for(int i=0;i<=n;i++){
cin>>num;
if(i==0){
a.push_back(num);
}
if(num<a.back()){
for(int j=0;j<a.size();j++){
if(num<a[j]){
a[j]=num;
break;
}
}
}
if(num>a.back()){
a.push_back(num);
}
}
cout<<a.size();
}