- 꼼꼼히 문제를 따지지 않으면 다양한 반례에 걸리기 쉬운 문제이다.
- 내 위치에서의 가장 긴 증가하는 부분 수열은, 이전까지의 가장 긴 증가하는 부분 수열에 1 (자기 자신)을 더한 값이다.
- 여기서 이전까지의 부분 수열들 중, 자기 자신보다 작은 값들의 수열들에 대해서만 고려해야 한다.
- 위의 로직을 매 반복마다 수행하기에는 O(n3) 이기 때문에, DP 배열을 만들어 이전의 값들을 담아놓기로 한다.
#include <iostream>
using namespace std;
int n;
int arr[1000]; // 입력받은 데이터
int ans[1000]; // 각 인덱스에 대한 최대 길이값을 담을 DP 배열
int main(void)
{
cin >> n;
for(int i = 0 ; i < n ; i++)
{
cin >> arr[i];
}
int answer = 0;
for(int i = 0 ; i < n ; i++) // DP 배열 채움
{
int max = 0;
for(int idx = 0 ; idx < i ; idx++) // 이전까지의 배열들을 탐색
{
if(arr[idx] < arr[i] && ans[idx] > max) // 자신보다 작은 입력값들 중, 최대 길이값을 찾음
{
max = ans[idx];
}
}
ans[i] = max + 1; // 해당 길이값에 자기 자신을 추가하여 길이값 저장
if(answer < ans[i]) answer = ans[i]; // 전체 길이값들 중 최댓값 갱신
}
cout << answer << endl;
}
'PS > BOJ' 카테고리의 다른 글
[백준] 11725.cpp : 트리의 부모 찾기 (0) | 2020.07.28 |
---|---|
[백준] 9465.cpp : 스티커 (0) | 2020.07.27 |
[백준] 1016.cpp : 제곱 ㄴㄴ 수 (0) | 2020.07.26 |
[백준] 15657.cpp : N과 M (8) (0) | 2020.07.25 |
[백준] 15654.cpp : N과 M (5) (0) | 2020.07.24 |