- Longest Increasing Subsequence; LIS
- 例えば数列みたいなののLISはと
- LISの長さは3
- DPとセグメントツリーで求まる
- 計算量は
実装
- DP(rust実装)
- dp[j]を「今までに見た要素の中から取り出せる長さjの単調増加部分列における部分列の末尾の要素の最小値」とおく
- dpの値は単調増加になるので二分探索により、あるiについてdp[i]を求めるのにO(logN)で求まる
- LISはdpの長さに相当する
fn main(){ let max_value: usize = (10_i32.pow(6)+ 1) as usize; let mut A: Vec<usize> = vec![2,4,1,3,3,5]; let mut dp: Vec<usize> = vec![max_value;A.len()]; for i in 0..A.len(){ let point = dp.binary_search(&A[i]).unwrap_or_else(|x| x); dp[point] = A[i]; } println!("LIS: {}", dp.iter().position(|&x| x==max_value).unwrap_or(A.len())); }