백준/증가수열 & 투포인터

[백준 2631번 / C++] 줄세우기

배발자 2022. 3. 7.
반응형

LIS 문제이다. 

 

수열이 만약 "3, 5, 8, 10, 1, 4" 으로 주어졌다면 직관적으로 1과 4를 앞에다가 놓으면 되는거 아닌가? 

라는 생각이 들면 된다. 그렇다면 그 기준이 뭘까? 

 

위의 수열에서 보면 3 < 5 < 8 < 10 > 1 < 4  이런식의 부등호가 될텐데, 

여기서 최장 증가 부분 수열은 "3, 5, 8, 10" 이다. 

 

즉, 가장 크게 증가 하는 연속된 부분 수열은 위치를 고정시키고 그 수열에 포함되지 않는 숫자들을

삽입해서 정렬한다고 생각하면 이해될 것이다. 

 

아래 코드를 보고 이해해보기를 권한다. 

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std; 
 

int main() {
	int n; cin >> n; 
	vector <int> v(n+1);
	for (int i = 1; i <= n; i++) {
		cin >> v[i]; 
	}
	int result = 0; 
	vector <int> dp(n + 1, 1); 
	for (int i = 2; i <= n; i++) {
		int max_n=1; 
		for (int j = i - 1; j >= 1; j--) {
			if (v[i] > v[j]) {
				max_n = max(max_n, dp[j] + 1); 
			}
		}
		dp[i] = max_n;
		result = max(result, dp[i]); 
	}
	cout << n - result; 

}

 

 

2631번: 줄세우기

KOI 어린이집에는 N명의 아이들이 있다. 오늘은 소풍을 가는 날이다. 선생님은 1번부터 N번까지 번호가 적혀있는 번호표를 아이들의 가슴에 붙여주었다. 선생님은 아이들을 효과적으로 보호하기

www.acmicpc.net

반응형

댓글