끄적끄적 코딩
article thumbnail

 

다이나믹 프로그래밍 문제입니다.

N명의 아이들을 순서대로 정렬 시키는 문제입니다.

LIS알고리즘으로 문제를 풀었습니다.

가장 잘 정렬되어있는 곳을 찾으면 나머지 학생들은 전부 이동해야하므로

최대길이 수열을 구하고 전체 인원에서 그 길이만큼을 빼면 결과가 나옵니다.

 

#include <iostream>
using namespace std; 

int child[200];    // 아이들 위치
int check[200];     // LIS확인

void init(int cycle) // 초기화
{ 
    for (int i = 0; i < cycle; ++i) { 
        check[i] = 1; 
    } 
} 

int main(int argc, char *argv[]) 
{ 
    int cycle; // 반복 횟수
    cin >> cycle; 
    init(cycle); 
    for (int i = 0; i < cycle; ++i) { 
        cin >> child[i]; 
    } 
    for (int i = 0; i < cycle; ++i) { 
        for (int j = i - 1; j >= 0; --j) { 
            if (check[i] <= check[j] && child[i] > child[j]) {  // 전 배열들을 검사해서 현재배열보다 수열이 크면서
                check[i] = check[j] + 1;                            // 값이 작으면 그 수열 +1한 값을 현재 배열에 삽입
            } 
        } 
    } 
    int max = 0; 
    for (int i = 0; i < cycle; ++i) { 
        if (max < check[i]) { 
            max = check[i]; 
        } 
    } 
    cout << cycle - max << endl; 
    return 0; 
}

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

[C++] 백준 1947번 선물 전달  (0) 2019.05.05
[C++] 백준 2579번 계단 오르기  (0) 2019.05.03
[C++] 백준 9048번 동전  (0) 2019.05.01
[C++] 백준 1965번 상자넣기  (0) 2019.04.10
[C++] 백준 1065번 한수  (0) 2019.04.07

검색 태그