🖥️ CS/Baekjoon Algorithms

#11053번 가장 긴 증가하는 부분 수열 (C++)

한국의 메타몽 2020. 10. 20. 09:28

링크 : www.acmicpc.net/problem/11053

 

11053번: 가장 긴 증가하는 부분 수열

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

www.acmicpc.net

 

이 문제는 영문명 'Longest Increaseing Subsequence (LIS)'로 잘 알려진 문제이다.

 

#include <iostream>
#include <algorithm>
#define MAX 1001
using namespace std;

int arr[MAX], sum[MAX], n = 0, ans = 1;

int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    cin >> n;
    for(int i=0; i<n; i++){
        cin >> arr[i];
        sum[i] = 1;
    }
    for(int i=1; i<n; i++){
        for(int j=0; j<i; j++){
            if(arr[i]>arr[j]){
                if(sum[i]<sum[j]+1) sum[i] = sum[j] + 1;
            }
        }
        if(ans<sum[i]) ans = sum[i];
    }
    cout << ans << "\n";
    return 0;
}

참고로 어떤 수건 부분집합의 증가하는 최대값으로 1을 가질 수 있으므로, 디폴트 정답을 1로 설정해야 맞을 수 있다.

 

'🖥️ CS > Baekjoon Algorithms' 카테고리의 다른 글

#2583번 영역구하기 (C++)  (0) 2020.10.20
#1912번 연속합 (C++)  (0) 2020.10.20
#2156번 포도주 시식 (C++)  (0) 2020.10.16
#10844번 쉬운 계단 수 (C++)  (0) 2020.10.15
#7569 토마토 (C++) 🍅  (0) 2020.10.07