LIS (하, p. 230)

LIS(Longest Increasing Subsequence) 문제는 vector와 binary search를 이용해서 $O(NlogN)$에 풀 수 있다.

소요 시간: 5분

image.png

1. $O(NlogN)$ 풀이 방법 (binary search)#

#include <bits/stdc++.h>
using namespace std;
vector<int> v;
int main() {
    ios::sync_with_stdio(false); cin.tie(0);
    int tc; cin >> tc;
    while(tc--) {
        int n; cin >> n;
        for(int i=0; i<n; i++) {
            int x; cin >> x;
            if(v.empty()) v.push_back(x);
            else {
                if(v.back() < x) v.push_back(x);
                else {
                    auto it = lower_bound(v.begin(), v.end(), x);
                    *it = x;
                }
            }
        }
        printf("%lu\n", v.size());
        v.clear();
    }
    return 0;
}

2. $O(N^2)$ 풀이 방법 (DP)#

#include <bits/stdc++.h>
using namespace std;
int v[501];
int dp[501];
int f(int x) {
    if(x==0) return 1;
    if(dp[x]) return dp[x];

    int & ret = dp[x];
    ret=1;
    for(int i=0; i<x; i++) {
        if(v[i]<v[x]) ret = max(ret, f(i)+1);
    }
    return ret;
}
int main() {
    ios::sync_with_stdio(false); cin.tie(0);
    int tc; cin >> tc;
    while(tc--) {
        int n; cin >> n;
        for(int i=0; i<n; i++) {
            cin >> v[i];
        }
        memset(dp, 0, sizeof(dp));

        int mx=0;
        for(int i=0; i<n; i++) {
            mx = max(mx, f(i));
        }
        printf("%d\n", mx);
    }
    return 0;
}