백준 2631 c++ : DP, LIS

magicdrill·2025년 1월 3일
0

백준 문제풀이

목록 보기
522/654

백준 2631 c++ : DP, LIS

#include <iostream>
#include <vector>

using namespace std;

void input_data(int* N, vector<int>& KOI_kindergarten) {
	cout << "input_data()\n";
	int i, num;

	cin >> *N;
	for (i = 0; i < *N; i++) {
		cin >> num;
		KOI_kindergarten.push_back(num);
	}

	return;
}

int find_answer(int N, vector <int>& KOI_kindergarten) {
	cout << "find_answer()\n";
	int answer = 0, max_count = 0;
	int i, j; 
	vector<int> DP(N + 1, 1);

	//최장 증가 부분 수열 -> LIS
	//가장 큰 증가하는 수열을 찾아서(부분적으로 정렬이 된 상태) 
	//-> 그 부분을 제외한 수들을 재배치하면 최소 비용으로 정렬 가능
	for (i = 1; i <= N; i++) {
		for (j = 1; j <= i; j++) {
			if (KOI_kindergarten[j - 1] < KOI_kindergarten[i - 1]) {
				DP[i] = max(DP[i] , DP[j] + 1);
			}
			cout << DP[j] << " ";
		}
		max_count = max(max_count, DP[i]);
		cout << " / max : " << max_count << "\n";
	}
	answer = N - max_count;

	return answer;
}

int main(void) {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int N;
	vector<int> KOI_kindergarten;

	input_data(&N, KOI_kindergarten);
	cout << find_answer(N, KOI_kindergarten) << "\n";

	return 0;
}

0개의 댓글