• toc {:toc}

문제 ν™•μΈν•˜κΈ°

풀이

O(N^2) 의 λ°©μ‹μœΌλ‘œ ν’€μ΄ν–ˆλ‹€. for 문을 두 번 μ‚¬μš©ν–ˆλ‹€.
타깃값 arr[i] λ₯Ό μ„€μ •ν•΄μ„œ i μ΄μ „μ˜ κ°’λ“€ arr[j] κ³Ό λΉ„κ΅ν•œλ‹€. λ§Œμ•½ νƒ€κ²Ÿκ°’μ΄ 더 크닀면 μ¦κ°€ν•˜λŠ” μˆ˜μ—΄μ΄ λ§Œλ“€μ–΄μ§„ 상황이닀. 즉, dp[j]μ—μ„œ 1을 더해 dp[i]에 μ €μž₯ν•˜μ—¬ κ°±μ‹ ν•΄μ€˜μ•Ό ν•œλ‹€. ν•˜μ§€λ§Œ dp[i] κ°€ 이미 λ§Œλ“€μ–΄μ Έ μžˆλŠ” 상황이라면 dp[j]+1κ³Ό dp[i]λ₯Ό 비ꡐ해 μ΅œλŒ€ μˆ˜μ—΄μ„ κ°±μ‹ ν•œλ‹€.

#include <bits/stdc++.h>
using namespace std;
 
int arr[1004], dp[1004];
 
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
 
    int n, res = 0;
 
    cin >> n;
 
    for(int i = 0; i < n; i++){
        cin >> arr[i];
    }
 
    fill(dp, dp+n, 1);
    for(int i = 0; i < n; i++){
        for(int j = 0; j < i; j++){
            if(arr[j] < arr[i]) dp[i] = max(dp[i], dp[j]+1);
        }
    }
 
    for(int i = 0; i < n; i++){
        if (res < dp[i]) res = dp[i];
    }
 
    cout << res << '\n';
 
    return 0;
}