LIS(최장 증가 부분 수열)
을 이용하는 DP
문제
n
에서 빼주면 답이 나온다.O(n^2)
의 dp
로 푼다. 현재 전깃줄의 dp
를 1
로 초기화해준 뒤, 이전 전깃줄보다 현재 전깃줄이 크다면 dp
값을 비교해 갱신한다.dp
의 최대값을 구해 n
에서 빼면 된다.#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int n;
cin >> n;
vector<vector<int>> v(n, vector<int>(2));
for (int i = 0; i < n; i++)
{
cin >> v[i][0] >> v[i][1];
}
sort(v.begin(), v.end());
vector<int> dp(n);
int remove = 0;
for (int i = 0; i < n; i++) // 현재
{
dp[i] = 1;
for (int j = 0; j < i; j++) // 이전
{
if (v[j][1] < v[i][1])
{
dp[i] = max(dp[i], dp[j] + 1);
}
}
remove = max(remove, dp[i]);
}
cout<<n-remove<<endl;
return 0;
}