반응형
문제 : https://www.acmicpc.net/problem/2565
서론
LIS 문제라는것을 알았는데도 풀이를 떠올리지 못했다.
전깃줄을 제거하는게 아니라 역으로 교차하지 않는 전깃줄을 세는것을 알고 난 후 문제의 예제 그림을 통해 이해할 수 있었다.
풀이
주어진 입력을 문제의 예제 그림과 같이 만들기 위해 A위치를 기준으로 오름차순 정렬한다.
그 후 B 위치를 기준으로 LIS정렬 해주면 된다.
구현
//c++
#include <iostream>
#include <algorithm>
using namespace std;
typedef struct {
int first;
int second;
}st;
int dp[102];
st line[102];
bool compare(st a, st b) {
return a.first < b.first;
}
int main() {
int n;
int result = 0;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> line[i].first >> line[i].second;
}
sort(line, line + n + 1, compare);
for (int i = 1; i <= n; i++) {
for (int j = 0; j < i; j++) {
if (line[i].second > line[j].second) {
if (dp[j] >= dp[i]) {
dp[i] = dp[j] + 1;
}
}
}
result = max(result, dp[i]);
}
cout << n - result;
}
최근댓글