오늘의 알고리즘

[C++] 백준 11054 가장 긴 바이토닉 부분 수열

하늘하늘 . 2022. 10. 26. 20:33
#include <iostream>
#include <vector>
#include <algorithm>
 
int arr[1001] = {};
 
int DPRight[1001] = {};
int DPLeft[1001] = {};
 
int main()
{
	int N = 0;
	std::cin >> N;
 
	for (int i = 0; i < N; ++i)
	{
		std::cin >> arr[i];
	}
 
	for (int i = 0; i < N; ++i)
	{
		for (int j = 0; j <= i; ++j)
		{
			if (arr[i] > arr[j])
			{
				DPRight[i] = std::max(DPRight[j] + 1, DPRight[i]);
			}
		}
	}
 
	for (int i = N - 1; i >= 0; --i)
	{
		for (int j = N - 1; j >= i; --j)
		{
			if (arr[i] > arr[j])
			{
				DPLeft[i] = std::max(DPLeft[j] + 1, DPLeft[i]);
			}
		}
	}
 
	int iMax = 0;
	int iMaxNumber = 0;
	for (int i = 0; i < N; ++i)
	{
		if (iMax < DPRight[i] + DPLeft[i])
		{
			iMax = DPRight[i] + DPLeft[i];
			iMaxNumber = i;
		}
	}
 
	std::cout << DPRight[iMaxNumber] + DPLeft[iMaxNumber] + 1;
 
	return 0;
}
 

왼쪽부터 순서에 따라서 가장 큰 것, 오른쪽부터 순서에 따라서 가장 큰 것들을 구해서

그 두개를 더했을 때 가장 큰 것을 입력했습니다.