欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

最长上升子序列(LIS总结)

程序员文章站 2022-07-03 17:44:27
...

定义

最长上升子序列是:

1:只包含ai的子序列

2:满足j<i并且aj<ai

3:子序列长度最长
朴素算法O(n^2) dp+二分(nlogn)最长上升子序列(LIS总结)
最长上升子序列(LIS总结)
dp数组维护的是以pos位置结尾最小可能的值,如果要打印最长上升子序列路径,开辟新数组path,倒着找合法序列,正序寻找就会出现1 2 4 6(2 8 6 7)这种不合法序列。虽然满足所有ai <aj 但是存在i>j。

vector<int>dp;
for(int i=0; i<n; ++i)
{
    int x;
    cin>>x;
    int pos=lower_bound(all(dp),x)-dp.begin();
    if(pos==cnt)
        dp.pb(x),++cnt;
    else
        dp[pos]=x;
}
cout<<dp.size()<<endl;

相关标签: # LIS