본문 바로가기

코딩테스트

[C++] (백준 11053번) 가장 긴 증가하는 부분 수열

문제출처: 백준
문제 링크: https://www.acmicpc.net/problem/11053
난이도: ★★★☆☆
  • 문제 분류: 다이나믹 프로그래밍 (DP)

[문제]

 


[분석]

n개의 원소를 배열에 저장한다.

배열의 맨 끝부터 맨 처음으로 내려오며 각각의 원소부터 시작하는 가장 긴 수열의 길이를 구하여 또다른 배열에 저장한다.

idx=n 부터 idx=0으로 진행할 때, 각 배열의 해당원소부터 배열의 끝까지 비교해 자신의 값보다 value가 크면서 가장 긴 수열의 길이를 가지고 배열의 값 +1의 값을 가진다. 자신의 원소에 대응하는 가장 긴 수열의 길이는 다른 배열에 직접 저장한다.

그후, 길이를 저장한 배열의 최대 값을 구해 해당 배열에서 나올 수 있는 가장 긴 수열의 길이를 가질 수 있게 한다.

간단한 식을 쓰면 다음과 같다. 


[코드]

#include <iostream>
using namespace std;

int arr[1001];
int max_len[1001];
int main() {
	int n;
	cin>>n;
	for(int i=0;i<n;i++) cin>>arr[i];
	
	int len=0;
	max_len[n-1]=1;
	for(int i=n-2;i>=0;i--){
	    int n_len=0;
	    for(int j=i+1;j<n;j++){
	        if((arr[i]<arr[j])&&(n_len<max_len[j])) n_len= max_len[j];
	    }
	    max_len[i]=n_len+1;
	
	}
	
	int real_max=max_len[0];
	for(int i=1;i<n;i++){
	    if(max_len[i]>real_max) real_max=max_len[i];
	}
	
    printf("%d\n",real_max);
}

'코딩테스트' 카테고리의 다른 글

[C++] (백준 11726 번) 2×n 타일링  (0) 2022.01.12
[C++] (백준 9095번) 1, 2, 3 더하기  (0) 2022.01.11
[C++] (백준 1463번) 1로 만들기  (0) 2022.01.05
[C++] 해밍코드  (0) 2021.07.07
[C++] 체크썸  (0) 2021.07.07