[BOJ] 14002번 : 가장 긴 증가하는 부분 수열 4

2024. 9. 21. 13:55Algorithm

1. problem : 

https://www.acmicpc.net/problem/14002

 

 

2. solution 1: 

#include <bits/stdc++.h>
using namespace std;
const int nums = 1005;
int A; 
int a[nums]; 
int d[nums]; 
int pre[nums]; 

int main(void) {
	ios::sync_with_stdio(0);
	cin.tie(0); 
	cin >> A; 
	for (int i = 1; i <= A; i++) cin >> a[i]; 

	for (int i = 1; i <= A; i++) {
		d[i] = 1; 
		pre[i] = -1;
		for (int j = 1; j < i; j++) {
			if (a[j] >= a[i]) continue;
			if (d[i] < d[j] + 1) {
				d[i] = d[j] + 1; 
				pre[i] = j;
			}
		}
	}
	int mx_idx = 1; 
	int mx_cnt = 1;
	for (int i = 1; i <= A; i++) {
		if (mx_cnt < d[i]) {
			mx_cnt = d[i]; 
			mx_idx = i;
		}
	}
	deque<int> dq; 
	dq.push_front(mx_idx); 
	cout << mx_cnt << '\n';
	while (pre[dq.front()] != -1) {
		dq.push_front(pre[dq.front()]);
	}
	for (int idx : dq) {
		cout << a[idx] << ' ';
	}
}

dp를 이용해 풀었다. 따라서, 세 가지 스텝으로 문제를 풀어나갔다. 

첫 번째, 테이블을 정의한다. d [i]는 i번째 인덱스를 포함했을 때 최장 길이를 저장한다. 

두 번째, 점화식을 작성한다. i전까지 loop를 돌며, d [i] < d [j] + 1을 만족한다면, d [i] = d [j] + 1이 된다. 만약에 그렇지 않다면, d [i] = 1이다. 

세 번째, 초기값을 설정한다. 초기값은 1로 했다. 그 이유는 각각의 수들은 자기 자신을 포함하니, 1이 돼야 한다. 

 

마지막으로 경로를 역추적하는 방법은 deque를 이용했다. pre라는 배열을 만들어, 이 배열에는 j값을 기록했다. 이 인덱스들을 deque에 담았고, 역추적을 했다. 

'Algorithm' 카테고리의 다른 글

[BOJ] 2156번 : 포도주 시식  (0) 2024.09.22
[BOJ] 11656번 : 접미사 배열  (1) 2024.09.21
[BOJ] 2240번 : 자두나무  (0) 2024.09.20
[BOJ] 13913번 : 숨바꼭질 4  (0) 2024.09.19
[BOJ] 6593번 : 상범 빌딩  (0) 2024.09.19