본문으로 바로가기

출처 : www.acmicpc.net/problem/11054

 

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

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

www.acmicpc.net

 

고려사항

- lis 알고리즘 활용

- 가장 긴 증가하는 부분 수열 길이 구하고서,

num을 뒤집어서 다시 가장 긴 증가하는 부분 수열들 구하기 => 구한 배열을 뒤집으면, 가장 긴 감소하는 부분 수열 길이가 구해진다.

- asc[i] + dsc[i] - 1 이 최대가 되는 값 출력.

 

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

int main() {
    int n, ans = -1;
    int num1[1000], num2[1000], asc[1000], dsc[1000];
    cin>>n;
    for(int i=0;i<n;++i){
        cin >> num1[i];
        num2[i] = num1[i];
    }

    reverse(num2, num2+n);
    for(int i=0;i<n;++i){
        asc[i] = 1;
        dsc[i] = 1;
        for(int j=0;j<i;++j){
            if(num1[j] < num1[i]){
                asc[i] = max(asc[j]+1, asc[i]);
            }
            if(num2[j] < num2[i]){
                dsc[i] = max(dsc[j]+1, dsc[i]);
            }
        }
    }

    reverse(dsc, dsc+n);
    for(int i=0;i<n;++i){
        ans = max(ans, asc[i]+dsc[i]-1);
    }
    
    cout<<ans;
    return 0;
}

'BOJ 백준 > Dynamic Programming' 카테고리의 다른 글

백준 01463 - 1로 만들기  (0) 2020.10.26
백준 02565 - 전깃줄  (0) 2020.10.25
백준 11053 - 가장 긴 증가하는 부분 수열  (0) 2020.10.23
백준 09251 - LCS  (0) 2020.10.23
백준 01912 - 연속합  (0) 2020.10.23