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

 

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

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

www.acmicpc.net


    • 바이토닉 부분 수열은, 증가하는 부분 수열과 감소하는 부분 수열이 합쳐진 개념이다.
    • 가장 긴 바이토닉 부분 수열의 길이를 구하기 위해서는, 위의 두 수열이 각각 갖는 최댓값을 인덱스별로 구해놓은 뒤, 가장 합이 높은 값을 구하면 된다.
    • 두 문제를 이미 풀었다면 어렵지 않게 풀 수 있다.
    • https://bconfiden2.tistory.com/272 (가장 긴 감소하는 부분 수열)
    • https://bconfiden2.tistory.com/161 (가장 긴 증가하는 부분 수열)

#include <iostream>

using namespace std;

int N;
int values[1000];
int fleft[1000];
int fright[1000];

int main(void)
{
    cin >> N;
    for(int i = 0 ; i < N ; i++)
    {
        fleft[i] = fright[i] = 1;
        cin >> values[i];
    }

    for(int i = 0 ; i < N ; i++)        // 가장 긴 증가하는 부분 수열
    {
        int maxi = 1;
        for(int k = 0 ; k < i ; k++)
        {
            if(values[k] < values[i])
            {
                if(fleft[k] + 1 > maxi) maxi = fleft[k] + 1;
            }
        }
        fleft[i] = maxi;
    }

    for(int i = N-1 ; i >= 0 ; i--)     // 가장 긴 감소하는 부분 수열
    {
        int maxi = 1;
        for(int k = N-1 ; k > i ; k--)
        {
            if(values[k] < values[i])
            {
                if(fright[k] + 1 > maxi) maxi = fright[k] + 1;
            }
        }
        fright[i] = maxi;
    }

    int answer = 0;
    for(int i = 0 ; i < N ; i++)        // 두 수열의 합 중 최댓값이 가장 긴 바이토닉 수열
    {
        if(fleft[i] + fright[i] > answer)
        {
            answer = fleft[i] + fright[i];
        }
    }
    cout << answer - 1 << endl;
}

'PS > BOJ' 카테고리의 다른 글

[백준] 1647 : 도시 분할 계획  (0) 2021.06.12
[백준] 4386 : 별자리 만들기  (0) 2021.06.11
[백준] 15723 : n단 논법  (0) 2021.06.09
[백준] 3190 : 뱀  (0) 2021.06.08
[백준] 11265 : 끝나지 않는 파티  (0) 2021.06.07

+ Recent posts