※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 2631번 문제인 줄세우기이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/2631
2631번: 줄세우기
KOI 어린이집에는 N명의 아이들이 있다. 오늘은 소풍을 가는 날이다. 선생님은 1번부터 N번까지 번호가 적혀있는 번호표를 아이들의 가슴에 붙여주었다. 선생님은 아이들을 효과적으로 보호하기
www.acmicpc.net
최소 몇 명을 움직여야 하는가 라는 문제 대신, 최대 몇 명을 움직이지 않아도 되는가 라는 문제를 생각해보자.
움직이지 않아도 되는 사람들 수는 현재 상태 그대로 있어도 줄이 제대로 서져있는, 즉 LIS를 이루고 있는 사람들을 의미한다.
따라서, 전체 인원 수에서 LIS의 길이를 빼주는 것으로 이 문제를 해결할 수 있다.
아래의 LIS 구현은 세그먼트트리를 이용한 구현이지만, DP로 구현하여도 상관없다.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
int seg[513];
int update(int L, int R, int qI, int qVal, int sI) {
if (R < qI || qI < L) return seg[sI];
if (L == R) return seg[sI] = qVal;
return seg[sI] = max(update(L, (L + R) / 2, qI, qVal, sI * 2), update((L + R) / 2 + 1, R, qI, qVal, sI * 2 + 1));
}
int rangemax(int L, int R, int qL, int qR, int sI) {
if (R < qL || qR < L) return 0;
if (qL <= L && R <= qR) return seg[sI];
return max(rangemax(L, (L + R) / 2, qL, qR, sI * 2), rangemax((L + R) / 2 + 1, R, qL, qR, sI * 2 + 1));
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int N; cin >> N;
for (int i = 0; i < N; i++) {
int x; cin >> x;
int temp = rangemax(1, N, 1, x, 1);
update(1, N, x, temp + 1, 1);
}
cout << N - seg[1];
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 2655 // C++] 가장높은탑쌓기 (0) | 2021.08.24 |
---|---|
[BOJ 1932 // C++] 정수 삼각형 (0) | 2021.08.23 |
[BOJ 1695 // C++] 팰린드롬 만들기 (0) | 2021.08.21 |
[BOJ 2482 // C++] 색상환 (0) | 2021.08.20 |
[BOJ 12970 // C++] AB (0) | 2021.08.19 |