Published 2020. 7. 26. 20:06
반응형
1. 문제
2. 문제 풀이
다이나믹 프로그래밍(DP)의 대표적인 유형 중 하나인 LIS 문제이다.
현재의 상태를 지속적으로 저장시켜서 문제를 푸는 DP의 특성을 이용하여 문제에 접근한다.
나의 경우에는 다음과 같은 방법을 고안했다.
각 값들에 대해서, 그 값까지 만들어지는 LIS를 지속적으로 저장시켜 나간다.
이 때, 현재의 LIS를 구하는 방법은 다음과 같다.
'자신보다 작은 이전의 Value들에 대해서, 그때까지의 LIS가 가장 큰 값에 1을 더한다.'
즉, 각 LIS 값은 다음과 같은 조건으로 구한다.
(1) 현재 LIS 값보다 이전의 값들에 대해서
(2) 현재 자신의 Value보다 작은 값들에 대해서
(3) LIS 값이 가장 큰 값을 구한 후, 그 값에 1을 더한 값으로 구한다.
(4) 만약 조건에 해당하는 값들이 없다면, 해당 LIS는 1이다.
이와 같은 과정을 반복하면 다음과 같이 상태가 변경된다.
3. 코드 (C++)
#include <iostream>
using namespace std;
int main(void)
{
cin.tie(NULL);
ios::sync_with_stdio(false);
int N, maxLIS = 1;
cin >> N;
int arr[1000][2] = { 0 };
for (int i = 0; i < N; i++) {
cin >> arr[i][0];
arr[i][1] = 1;
}
for (int i = 1; i < N; i++)
{
int maxSeq = -1;
for (int j = 0; j < i; j++)
{
if (maxSeq < arr[j][1] && arr[i][0] > arr[j][0])
{
maxSeq = arr[j][1];
}
}
if (maxSeq != -1)
{
arr[i][1] = maxSeq + 1;
if (maxLIS < maxSeq + 1) maxLIS = maxSeq + 1;
}
}
cout << maxLIS << '\n';
return 0;
}
반응형
'Programming > 백준 문제풀이' 카테고리의 다른 글
[백준/12865] 평범한 배낭 (KnapSack 문제) (1) | 2020.08.03 |
---|---|
[백준/9251] LCS (Longest Common Subsequence) 문제풀이 (0) | 2020.08.02 |
[백준/2579] 계단 오르기 (C++) (0) | 2020.07.26 |
[백준/11729] 하노이 탑 이동 순서 (C++) (0) | 2020.07.18 |
[백준/9370번] 미확인 도착지 (0) | 2020.04.19 |