---
# System prepended metadata

title: Longest Increasing Subsequence (LIS) 最長遞增子序列

---

# Longest Increasing Subsequence (LIS) 最長遞增子序列
最長遞增子序列是什麼？
就是字面上的意思
沒什麼好說的
舉個栗子🌰
[3 5 2 3 7]這個數列中的最長遞增序列為[2 3 7]
用眼睛看一下就能出來
但是要怎麼有效的找出來呢？

用上面的例子說明如何找出最長遞增子序列的長度:
![](https://i.imgur.com/tNNjxgD.png)

![](https://i.imgur.com/EEwTR4F.png)

![](https://i.imgur.com/dsykDyS.png)


### CSES:Increasing Subsequence   
https://cses.fi/problemset/task/1145
```cpp=
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define inf 2e18
#define maxn 100005
#define mod 1000000007


signed main(){

    ios::sync_with_stdio(0);
    cin.tie(0);

    int n;
    cin>>n;
    vector<int>vec(n+1);    //從1開始數
    for(int i=1;i<=n;i++){
        cin>>vec[i];
    }
    vector<int>lis;
    lis.push_back(vec[1]);    //把第一項直接放進去Lis中，如上圖步驟1
    for(int i=2;i<=n;i++){    //從第二項一路走到最後一項
        if(vec[i]>*lis.rbegin()){//如果此數大於Lis中的最後一項(當前Lis中最大的數)，
            lis.push_back(vec[i]);//則直接將此數加入Lis的最後一項，如上圖步驟2及步驟7
        }
        else{//否則找到第一個大於此數的數並且將其替換掉，如步驟4及步驟6
            *lower_bound(lis.begin(),lis.end(),vec[i])=vec[i];
        }
    }
    cout<<lis.size();
}
```