[ 백준 ] 1965 / 상자넣기

金弘均·2021년 9월 16일
0

Baekjoon Online Judge

목록 보기
202/228
post-thumbnail

# Appreciation

/*
 * Problem :: 1965 / 상자넣기
 *
 * Kind :: Dynamic Programming
 *
 * Insight
 * - LIS = Longest Increasing Subsequence
 *   + max(len(LIS)) 를 구하는 문제이다
 *     # dp[i] = i 번째 상자를 마지막으로 하는 가장 긴 LIS 의 길이
 *       -> j = 0 ~ (i-1) 번째 상자를 탐색하며
 *          i 번째 상자가 j 번째 상자보다 크다면
 *          dp[i] 와 dp[j]+1 을 비교해서 dp[i] 를 갱신해주자
 *
 * Point
 * - N=10^3 밖에 안되니
 *   O(N^2) 이어도 시간내에 널널하게 풀 수 있다
 */

# Code

//
//  BOJ
//  ver.C++
//
//  Created by GGlifer
//
//  Open Source

#include <iostream>
#include <algorithm>

using namespace std;

#define endl '\n'

// Set up : Global Variables
/* None */

// Set up : Functions Declaration
/* None */


int main()
{
    // Set up : I/O
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    // Set up : Input
    int N; cin >> N;
    int A[N];
    for (int i=0; i<N; i++)
        cin >> A[i];

    // Process
    int dp[N]; /* dp[i] = i 번째 상자를 마지막으로 하는 가장 긴 LIS 의 길이 */
    fill(dp, dp+N, 1); /* dp 를 1로 초기화 <= min(LIS)=1 */
    for (int i=1; i<N; i++) {
        for (int j=0; j<i; j++) {
            if (A[i] > A[j]) { /* i 번째 상자가 j 번째 상자보다 크다면 */
                dp[i] = max(dp[i], dp[j]+1); /* dp[i] 와 dp[j]+1 을 비교하여
                                              * dp[i] 값을 갱신 */
            }
        }
    }

    // Control : Output
    /* max(dp[i]) 를 출력 */
    cout << *max_element(dp, dp+N) << endl;
}

// Helper Functions
/* None */
profile
이런 미친 게임을 봤나! - 옥냥이

0개의 댓글