문제

문제 분류 : dp

코드

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <utility>
using namespace std;

int dp[1001] = { 0 };

int main() {
    cin.tie(NULL);
    cout.tie(NULL);
    ios::sync_with_stdio(false);
    int num;
    int max = 0;
    int max_dp = 1;
    int temp = 0;
    vector<int> vec;
    fill_n(dp, 1001, 1);
    cin >> num;
    for (int i = 0; i < num; i++) {
        cin >> temp;
        vec.push_back(temp);
    }
    for (int i = 1; i < num; i++) {
        max = 0;
        for (int j = 0; j < i; j++) {
            if (vec[i] > vec[j]) {
                if (dp[j] > max)
                    max = dp[j];
            }
        }
        dp[i] += max;
        if (dp[i] > max_dp)
            max_dp = dp[i];
    }    
    cout << max_dp;
}

설명

이 문제를 DP로 풀기위해서 다음과 같이 접근 하였다.

  1. 모든 dp 값을 1로 초기화 한다.

    • 왜냐하면 모두가 자기 자신을 수열로 가지기 때문이다.
  2. 기준 dp 값의 이전값들을 모두 탐색하여 기준 값보다 작을 경우 max라는 변수에 작은 부분의 dp의 값과 기준 dp의 값을 더한다 (n + 1)

  3. 반복하여 만약 max 값이 새로운 값보다 작다면 max 값을 변경하고 새로운 값으로 교체한다.

예시

예제문제로 {10, 20 , 10, 30 , 20 , 50} 배열이 있을 경우

  1. dp[1]일 때

    1. dp[1] > dp [0] 이므로 dp[1] += dp[0] 이다.
  2. dp[2]일 때

    1. dp[2] == dp[0] 이므로 넘어간다.
    2. dp[2] < dp[1] 이므로 넘어간다.
  3. dp[3]일 때

    1. dp[3] > dp[0] 이므로 dp[3] += dp[0] 이다.
    2. dp[3] > dp[1] 이므로 dp[3] += dp[1] 이다.
    3. dp[3] > dp[2] 이므로 dp[3] += dp[2] 이다.

이렇게 반복해서 dp의 값중 가장 큰 값이 가장 긴 증가하는 부분 수열의 길이가 된다.

'알고리즘 > BOJ' 카테고리의 다른 글

[BOJ] 1094번 : 01타일  (0) 2021.06.30

+ Recent posts