Algorithm/BOJ
[백준 알고리즘/C++] 11053 가장 긴 증가하는 부분 수열
pinevienna
2021. 2. 3. 16:59
수열 A = {10, 20, 10, 30, 20, 50} 인 경우
가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고 수열의 길이는 4가 된다.
수열이 주어졌을 때 가장 긴 증가하는 부분 수열의 길이를 출력하는 문제
만약 {10, 12, 11, 12, 13, 15, 16, 18, 30} 이렇게 입력받는다면
12를 빼고 {10, 11, 12, 13, 15, 16, 18, 30} 이 가장 긴 수열이다
이걸 어떻게 판단하느냐..
증가하는 수열의 길이를 dp배열에 넣고, 계속 비교해가며 가장 긴 수열을 찾으면 된다
dp[i]에 1을 넣어두고, A[1]부터 A[i-1]번째 수까지 A[i]와 비교하는 아주 dp스러운 문제..
A[j](1 ≤ j < i) 번째 수가 A[i]보다 작을 때 마다 dp[i]와 dp[j]+1을 비교하여 더 큰 값을 dp[i]에 넣어주면 됨
이걸 아이패드 없이 친절하게 설명할 자신이 없다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int n, input[1001] = { 0, }, arr[1001] = { 0, }, res = 1;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> input[i];
arr[i] = 1;
for (int j = 1; j < i; j++) {
if (input[i] > input[j]) {
arr[i] = max(arr[i], arr[j] + 1);
}
if (arr[i] > res) {
res = arr[i];
}
}
}
cout << res;
}
|
cs |