danbibibi
article thumbnail

문제

문제 바로가기> BOJ 11053번: 가장 긴 증가하는 부분 수열

 

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

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

www.acmicpc.net

 

풀이

DP와 이중 for문을 이용해 "현재 수를 마지막으로 하는 가장 긴 증가하는 부분 수열"의 길이를 저장해주었다.

이렇게 저장해두면, 답은 dp 배열 중 가장 큰 값이 되고, 이를 반복문을 돌 때 함께 업데이트 해주면 된다!

 

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

int N;
int A[MAX], dp[MAX]; // dp[i] : i번째 값을 마지막으로 하는 가장 긴 증가하는 부분 수열

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

void solution(){  
    int ans = 0;
    for(int i=0; i<N; i++){
        dp[i] = 1;
        for(int j=0; j<i; j++) {
            if(A[j] < A[i]) dp[i] = max(dp[i], dp[j]+1);
        }
        ans = max(ans, dp[i]);
    } cout << ans;
}

int main(){
    freopen("input.txt", "r", stdin);
    input();
    solution();
}

'문제 풀이 > 백준' 카테고리의 다른 글

BOJ 16974번: 레벨 햄버거  (0) 2023.02.21
BOJ 2531번: 회전초밥  (0) 2023.02.21
BOJ 2098번: 외판원 순회  (0) 2023.02.19
BOJ 2042번: 구간 합 구하기  (0) 2023.02.17
BOJ 10597번: 순열장난  (0) 2023.02.17
profile

danbibibi

@danbibibi

꿈을 꾸는 시간은 멈춰 있는 것이 아냐 두려워하지 마 멈추지 마 푸른 꿈속으로