728x90

단계별로 풀어보기 동적계획법 1의 12단계 문제

 

11054번: 가장 긴 바이토닉 부분 수열

첫째 줄에 수열 A의 크기 N이 주어지고, 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ Ai ≤ 1,000)

www.acmicpc.net

LIS는 앞에서부터 구해서 increasingDp에 저장했고 LDS는 뒤에서부터 구해서 decreasingDp에 저장했다.

그리고 bitonicDp는 그 increasingDp[i]와 decreasingDp[i]를 더하고 i번째 수는 중복되어 세었으니 1을 빼주었다.

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

int main() {
	int n;
	cin >> n;
	vector<int>	v(n);
	for (int i = 0; i < n; i++) {
		cin >> v[i];
	}
	vector<int> increasingDp(n);
	vector<int> decreasingDp(n);
	increasingDp[0] = 1;
	for (int i = 1; i < n; i++) {
		int maxLength = 0;
		for (int j = 0; j < i; j++) {
			if (v[j] < v[i] && increasingDp[j] > maxLength) {
				maxLength = increasingDp[j];
			}
		}
		increasingDp[i] = maxLength + 1;
	}
	decreasingDp[n - 1] = 1;
	for (int i = n - 1; i >= 0; i--) {
		int maxLength = 0;
		for (int j = n - 1; j > i; j--) {
			if (v[i] > v[j] && decreasingDp[j] > maxLength) {
				maxLength = decreasingDp[j];
			}
		}
		decreasingDp[i] = maxLength + 1;
	}
	vector<int> bitonicDp(n);
	for (int i = 0; i < n; i++) {
		bitonicDp[i] = increasingDp[i] + decreasingDp[i] - 1;
	}
	int maxDp = 0;
	for (int i = 0; i < n; i++) {
		if (bitonicDp[i] > maxDp) maxDp = bitonicDp[i];
	}
	cout << maxDp;
	return 0;
}
728x90

'알고리즘 문제' 카테고리의 다른 글

[백준] 1912번 연속합  (0) 2020.02.06
[백준] 2656번 전깃줄  (0) 2020.02.06
[백준] 11651번 좌표 정렬하기 2  (0) 2020.02.06
[백준] 2583번 영역 구하기  (0) 2020.02.06
[백준] 2468번 안전영역  (0) 2020.02.06

+ Recent posts