문제
풀이
- 시작 번호를 기준으로 줄을 정렬한다.
- 끝 번호를 기준으로 증가 수열의 가장 긴 길이를 찾는다.
- 전체 라인의 개수에서 가장 긴 증가 수열의 길이를 빼면 없애야하는 최소 줄의 개수를 알 수 있다.
- 시작번호로 정렬을 한 후에 끝번호가 증가 수열이라면 줄이 절대 겹치지 않는다.
코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef struct line {
int start;
int end;
int DP = 0;
}line;
bool compare(line a, line b) {
return a.start < b.start;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
vector<line> line_v;
int N;
cin >> N;
for (int i = 0; i < N; i++) {
line tmp_line;
cin >> tmp_line.start >> tmp_line.end;
line_v.push_back(tmp_line);
}
sort(line_v.begin(), line_v.end(), compare);
for (int i = 0; i < line_v.size(); i++) {
int tmp_max = 0;
for (int j = 0; j < i; j++) {
if (line_v[j].end < line_v[i].end) {
if (tmp_max < line_v[j].DP) {
tmp_max = line_v[j].DP;
}
}
}
line_v[i].DP = tmp_max + 1;
}
int result = 0;
for (int i = 0; i < line_v.size(); i++) {
if (result < line_v[i].DP) {
result = line_v[i].DP;
}
}
cout << line_v.size() - result << '\n';
return 0;
}