문제 링크입니다: https://www.acmicpc.net/problem/2631
http://jaimemin.tistory.com/430와 비슷하게 LIS를 떠올리는 것이 핵심인 문제였습니다.
결국 어린이들 중 정렬이 안되있는 어린이들만 정렬하면 되므로 (총 어린이 수 - 최대 증가 순열)을 구하면 되는 문제였습니다.
#include <iostream>
#include <algorithm>
#include <cstring> //memset
using namespace std;
const int MAX = 200;
int N;
int arr[MAX];
int cache[MAX + 1];
int LIS(int start) //Longest Increasing Sequence
{
int &result = cache[start + 1];
if (result != -1)
return result;
result = 0;
for (int next = start + 1; next < N; next++)
if (start == -1 || arr[start] < arr[next])
{
int candidate = 1 + LIS(next);
if (result < candidate)
result = candidate;
}
return result;
}
int main(void)
{
cin >> N;
if (N<2 || N>MAX)
exit(-1);
for (int i = 0; i < N; i++)
cin >> arr[i];
memset(cache, -1, sizeof(cache));
//정렬되어있는 학생들은 안 움직여도 된다
cout << N - LIS(-1) << endl;
return 0;
}
개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
'알고리즘 > BOJ' 카테고리의 다른 글
백준 2302번 극장 좌석 (0) | 2018.03.11 |
---|---|
백준 2098번 외판원 순회 (4) | 2018.03.11 |
백준 10164 격자상의 경로 (0) | 2018.03.10 |
백준 2011 암호코드 (2) | 2018.03.09 |
백준 9507 Generations of Tribbles (0) | 2018.03.09 |