문제 링크 : www.acmicpc.net/problem/2631
문제에서 한 아이의 위치를 옮기는 것은 항상 맨 앞으로 보내거나, 맨 뒤로 보내는 것에 유의하자.
이렇게 위치를 옮기는 횟수를 최소화하려면, 최초 아이들의 순서에서 이미 번호 순으로 서 있는 아이들을 제외한 나머지를 옮기면 된다.
즉, 예제의 (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<int, int> 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 |