알고리즘/BOJ 문제풀이

[LIS] BOJ 2631 줄세우기

4Legs 2021. 1. 14. 18:09

문제 링크 : www.acmicpc.net/problem/2631

 

2631번: 줄세우기

KOI 어린이집에는 N명의 아이들이 있다. 오늘은 소풍을 가는 날이다. 선생님은 1번부터 N번까지 번호가 적혀있는 번호표를 아이들의 가슴에 붙여주었다. 선생님은 아이들을 효과적으로 보호하기

www.acmicpc.net

문제에서 한 아이의 위치를 옮기는 것은 항상 맨 앞으로 보내거나, 맨 뒤로 보내는 것에 유의하자.

이렇게 위치를 옮기는 횟수를 최소화하려면, 최초 아이들의 순서에서 이미 번호 순으로 서 있는 아이들을 제외한 나머지를 옮기면 된다.

즉, 예제의 (3 7 5 2 6 1 4) 에서, 이미 3, 5, 6의 올바른 순서가 존재하므로 이들을 제외한 나머지 7, 2, 1, 4를 옮기면 1 ~ 7의 오름차순 순서를 만들 수 있다. (옮기는 순서는 고려하지 않아도 된다.)

따라서 이 문제는 주어진 수열에서 LIS를 찾는 문제임을 알 수 있다.

[코드]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <memory.h>
 
using namespace std;
typedef pair<intint> p;
typedef long long ll;
 
int n;
int arr[201], dp[201];
 
void lis() {
    for (int i = 2; i <= n; i++) {
        for (int j = 1; j < i; j++) {
            if(arr[j] < arr[i])
                dp[i] = max(dp[i], dp[j] + 1);
        }
    }
}
 
void init() {
    cin >> n;
 
    for (int i = 1; i <= n; i++) {
        cin >> arr[i];
        dp[i] = 1;
    }
}
 
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(NULL);
 
    init();
    lis();
 
    int max_dp = 0;
    for (int i = 1; i <= n; i++) max_dp = max(max_dp, dp[i]);
    printf("%d\n", n - max_dp);
 
    //system("PAUSE");
    return 0;
}
cs

'알고리즘 > BOJ 문제풀이' 카테고리의 다른 글

[DP] BOJ 1086 박성원  (0) 2021.01.17
[DFS] BOJ 17501 수식 트리  (0) 2021.01.16
[LIS] BOJ 11054 가장 긴 바이토닉 부분 수열  (0) 2021.01.14
[DP] BOJ 2618 경찰차  (1) 2021.01.11
[Floyd] BOJ 13141 Ignition  (0) 2021.01.08