반응형
2631번: 줄세우기
KOI 어린이집에는 N명의 아이들이 있다. 오늘은 소풍을 가는 날이다. 선생님은 1번부터 N번까지 번호가 적혀있는 번호표를 아이들의 가슴에 붙여주었다. 선생님은 아이들을 효과적으로 보호하기 위해 목적지까지 번호순서대로 일렬로 서서 걸어가도록 하였다. 이동 도중에 보니 아이들의 번호순서가 바뀌었다. 그래서 선생님은 다시 번호 순서대로 줄을 세우기 위해서 아이들의 위치를 옮기려고 한다. 그리고 아이들이 혼란스러워하지 않도록 하기 위해 위치를 옮기는 아이들의
www.acmicpc.net
풀이 ) DP - LIS
LIS를 활용한 문제이다. 옮겨지는 아이들을 주목해서 입력 예시인 3 7 5 2 6 1 4 에서 옮겨지는 아이를 다른 색으로 표시하면 3 7 5 2 6 1 4 가 된다.
이 때 옮겨지는 아이, 즉 붉은색으로 표시된 아이들을 제외하고는 가장 긴 부분 수열을 만족하는 것을 알 수 있다. 가장 긴 부분 수열에서 해당하지 않는 아이만 옮겨주면 된다는 뜻이다.
#include <cstdio>
#include <algorithm>
using namespace std;
int main(void)
{
int n, arr[201] = {0, }, memo[201], move = 0;
scanf("%d", &n);
for(int i = 0; i < n; ++i)
scanf("%d", arr+i);
fill(memo, memo+sizeof(memo)/sizeof(int), 1);
for(int i = 0; i < n; ++i){
for(int j = 0; j < i; ++j)
if(arr[i] > arr[j])
memo[i] = max(memo[i], memo[j]+1);
move = max(move, memo[i]);
}
printf("%d\n", n-move);
}
반응형
'문제풀이 > 백준' 카테고리의 다른 글
[C++] 백준 - 16282 : Black Chain (0) | 2020.03.27 |
---|---|
[C++] 백준 - 1965 : 상자넣기 (0) | 2020.03.26 |
[C++] 백준 - 11053 : 가장 긴 증가하는 부분 수열 (0) | 2020.03.25 |
[C++] 백준 - 2644 : 촌수계산 (0) | 2020.03.24 |
[C++] 백준 - 10971 : 외판원 순회 2 (0) | 2020.03.24 |