728x90
반응형
11053번: 가장 긴 증가하는 부분 수열
문제
https://www.acmicpc.net/problem/11053
풀이
가장 긴 증가하는 부분 수열 LIS(Longest Increasing Subsequence)를 이용한 문제다. O(N^2)가 걸리는 dp를 사용한 풀이로 풀린다. dp는 해당 index에서 끝나는 가장 긴 증가하는 부분 수열을 의미한다. 모든 수는 길이가 1인 증가하는 부분 수열이므로 dp를 모두 1로 초기화한다. 그리고 i = 0부터 N-1까지 증가하며 차례대로 j = 0부터 i-1까지 v[j]가 v[i]보다 작은 값 중 dp[j]가 가장 큰 값 + 1을 dp[i]로 한다. 그리고 dp 배열에서 가장 큰 원소를 출력하면 된다.
모두 탐색을 마쳤으므로 dp 배열에서 가장 큰 원소인 4를 출력하면 답이다.
코드
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int n;
cin >> n;
vector<int> v(n), dp(n, 1);
for (int i = 0; i < n; i++)
cin >> v[i];
for (int i = 0; i < n; i++)
for (int j = 0; j < i; j++)
if (v[j] < v[i])
dp[i] = max(dp[i], dp[j] + 1);
cout << *max_element(dp.begin(), dp.end()) << '\n';
return 0;
}
728x90
반응형
'Problem Solving > BOJ' 카테고리의 다른 글
[백준 / BOJ] C++ 2565 전깃줄 (0) | 2023.02.10 |
---|---|
[백준 / BOJ] C++ 11722 가장 긴 감소하는 부분 수열 (0) | 2023.02.09 |
[백준 / BOJ] C++ 1124 언더프라임 (0) | 2023.02.08 |
[백준 / BOJ] C++ 1110 더하기 사이클 (0) | 2023.02.08 |
[백준 / BOJ] C++ 1085 직사각형에서 탈출 (0) | 2023.02.08 |