原dp[i]代表以i结尾的LIS的长度
现在dp[i]代表长度为i的LIS的最小元素
dp一定为一个递增数组
遍历a,当a[i]比当前LIS的最后一个数字还大,则长度++
否则就二分查找dp数组中第一个>=a[i]的数值,并把它改为a[i]
#include <bits/stdc++.h> using namespace std; const int maxn = 10010, INF = 0x7fffffff; int a[maxn], dp[maxn]; int main() { memset(dp, 0x7f, sizeof(dp)); int n, k = 0; cin >> n; for(int i = 0; i < n; i++) { if(a[i] > dp[k]) dp[++k] = a[i]; else *lower_bound(dp, dp + k, a[i]) = a[i]; } cout << k << endl; return 0; }
- 当a[i]比当前最长的序列的最后一个数字还大,那么长度++;
- 否则就二分查找dp数组中第一个>=a[i]的数值,并把它改为a[i]。