关于LIS的优化
LIS是动态规划中经典的问题。
首先我们令f[i]表示前i个元素中最长上升(不下降同理)子序列长度,那么我们有:
朴素的算法当中我们在外层枚举1~n,内层枚举1~i-1来挨个比较转移,这样的时间复杂度是
考虑优化。我们可以在求出当前最长上升子序列时试着储存一下此时的子序列到底是什么。但是请注意,这并不代表储存的序列就是最终答案!
那么我们就可以对于此时储存的子序列使用二分,对于当前的
#include<bits/stdc++.h>
using namespace std;
int n;
int a[100010];
int d[100010];
int len;
int main() {
cin >> n;
for(int i = 1; i <= n;i++) {
cin >> a[i];
}
d[++len] = a[1];
for(int i = 2;i <= n;i++) {
if(a[i] > d[len]) d[++len] = a[i];
else d[upper_bound(d+1,d+1+len,a[i])-d] = a[i];
}
cout << len;
return 0;
return 0;
}