[BOJ]11054번 가장 긴 바이토닉 부분 수열

yeham·2022년 12월 18일
0

백준

목록 보기
20/22

문제

가장 긴 바이토닉 부분 수열

코드

#include <iostream>

using namespace std;

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);

	int n, mx;

	cin >> n;

	int arr[n];
	int dp[n];
	int dp2[n];

	for (int i = 0; i < n; i++)
	{
		dp[i] = 1;
		dp2[i] = 1;
	}

	for (int i = 0; i < n; i++)
		cin >> arr[i];
	
	for (int i = n - 2; i >= 0; i--)
		for (int j = i + 1; j < n; j++)
			if (arr[i] > arr[j])
				dp[i] = max(dp[i], dp[j] + 1);

	for (int i = 1; i < n; i++)
		for (int j = i - 1; j >= 0; j--)
			if (arr[i] > arr[j])
				dp2[i] = max(dp2[i], dp2[j] + 1);

	for (int i = 0; i < n; i++)
		dp[i] = dp[i] + dp2[i] - 1;

	mx = 0;
	for (int i = 0; i < n; i++)
		mx = max(mx, dp[i]);
	cout << mx;
    return (0);
}

배운점

이전 포스팅인 가장 긴 증가/감소 하는 수열을 잘 이해했다면, 바로 풀 수 있는 문제였습니다.
문제를 보자마자 이렇게 해결하면 되겠구나 하고 5분만에 작성했습니다.
dp문제를 단순하게 점화식만 찾고 해결하는 방식이 아닌 2가지 경우로 분리 후 다시 합치는 문제도 있다는걸 배운 문제였습니다.

profile
정통과 / 정처기 & 정통기 / 42seoul 7기 Cardet / 임베디드 SW 개발자

0개의 댓글