백준 알고리즘
[백준 알고리즘] 7570 c++ 줄 세우기
mindun
2025. 2. 5. 10:09
반응형

전체 어린이 수 - 가장 큰 1씩 증가하는 부분 수열 = 정답
어린이를 초기 위치에서 맨 앞이나 맨 뒤로만 이동시킬 수 있음.
1. n 명의 어린이들 위치를 정렬시키는 데에는 최대 n 번이 걸림
2. 최대 n번 옮기되, 옮기지 않아도 되는 수가 존재 -> 가장 긴 1씩 증가하는 부분수열을 제외한 수만큼 옮기는 것이 최소화하는 방법
3. 단, n 제곱의 LIS 방법으로 부분수열을 구하게 된다면 시간초과가 날 것 (n의 수 == 1,000,000)
4. 부분수열을 구하는 점화식이 중요4
점화식 : DP[입력된 아이의 번호] = DP[입력된 아이의 번호 - 1] + 1
순방향 정렬이기 때문에, i = 1 노드부터 올라가며 진행하면 된다.
#include <iostream>
#include <algorithm>
int list[1000001] = {};
int dp[1000001] = {};
int main() {
std::ios::sync_with_stdio(0);
std::cin.tie(0);
int n;
std::cin >> n;
for (int i{ 1 }; i <= n; i++) std::cin >> list[i];
int ans = 0;
for (int i{ 1 }; i <= n; i++) {
dp[list[i]] = dp[list[i] - 1] + 1;
ans = std::max(dp[list[i]], ans);
}
std::cout << n - ans << "\n";
}반응형