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

 

11722번: 가장 긴 감소하는 부분 수열

수열 A가 주어졌을 때, 가장 긴 감소하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 30, 10, 20, 20, 10} 인 경우에 가장 긴 감소하는 부분 수열은 A = {10, 30, 10, 20, 20, 10} 

www.acmicpc.net


    • 가장 ~ 증가하는 부분 수열 시리즈와 비슷한 내용인데, 수열의 방향만 달라진 문제이다.
    • 11053 번 문제와 11055 번 문제를 둘 다 풀었기 때문에 쉽게 접근할 수 있었다.
    • i번째 값에 해당 위치까지 가장 긴 최소 부분 수열의 길이를 담아주는 DP 배열을 사용한다.
    • https://bconfiden2.tistory.com/161

#include <iostream>
#include <vector>

using namespace std;

int main(void)
{
    int N;
    cin >> N;

    vector<int> v(N, 0);                // 실제 데이터
    vector<int> answer(N, 0);           // 각 위치별로 가장 긴 감소하는 부분 수열의 길이

    for(int i = 0 ; i < N ; i++)
    {
        cin >> v[i];
    }

    int maxi = 0;
    for(int i = 0 ; i < N ; i++)
    {
        int temp = 1;                   // i 번째 위치의 가장 긴 길이를 담을 값
        for(int j = 0 ; j < i ; j++)    // 자신 이전까지 모든 최대 길이들을 확인
        {
            if(answer[i] < answer[j] + 1 && v[i] < v[j])    // 최대 길이가 갱신될 경우(감소 부분 수열 조건도 만족)
            {
                answer[i] = answer[j] + 1;
                temp = answer[i];
            }
        }
        if(temp > maxi) maxi = temp;    // 이번 값이 전체값들 중 최대길이인지 확인
        answer[i] = temp;               // i 번째 값 업데이트
    }
    cout << maxi << endl;
}

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

[백준] 11653 : 소인수분해  (0) 2021.05.28
[백준] 13305 : 주유소  (0) 2021.05.27
[백준] 11779 : 최소비용 구하기 2  (0) 2021.05.24
[백준] 4485 : 녹색 옷 입은 애가 젤다지?  (0) 2021.05.23
[백준] 11444 : 피보나치 수 6  (0) 2021.05.22

+ Recent posts