LIS优化

原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]。
自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。
原文地址:https://www.cnblogs.com/WTSRUVF/p/14429306.html