Algorithm/dynamic programming
[백준] 알고리즘 11053번 - 전깃줄 문제
낭강
2021. 3. 20. 14:13
문제
2565번: 전깃줄
첫째 줄에는 두 전봇대 사이의 전깃줄의 개수가 주어진다. 전깃줄의 개수는 100 이하의 자연수이다. 둘째 줄부터 한 줄에 하나씩 전깃줄이 A전봇대와 연결되는 위치의 번호와 B전봇대와 연결되는
www.acmicpc.net
소스코드
#include <bits/stdc++.h>
using namespace std;
vector<pair<int, int>> v1;
int dp[501];
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
int n,ans=0;
cin >> n;
for (int i = 0; i < n; i++) {
int x, y;
cin >> x>> y;
v1.push_back(make_pair(x, y));
}
sort(v1.begin(), v1.end());
for (int i = 0; i < n; i++) {
dp[i] = 1;
for (int j = 0; j < i; j++) {
if(v1[j].second<v1[i].second)
dp[i] = max(dp[i], dp[j] + 1);
}
ans = max(dp[i], ans);
}
cout << n - ans;
}
풀이
LIS 문제를 해결하고 이 문제를 해결하면 쉽게 풀 수 있다.
DP[i]에는 i번째를 마지막으로 했을경우의 증가되는 수열의 길이를 저장한다.
이 문제에서는 제거되는 전깃줄과 가장긴 증가되는 수열의 길이의 관계를 생각해내면 풀 수 있다.