0. 문제 |
1. 아이디어 |
1) bottom-up 방식으로 문제를 풀이한다.
2) N번째 열까지 구할 수 있는 증가하는 가장 긴 부분 수열의 길이는 0번부터 N-1 번열 중 자신보다 작은 원소가 구했던 가장 긴 부분 수열의 길이 +1(본인의 길이)이 된다. 이때, N-1번 열까지 구했던 길이는 dp에 메모이제이션한다.
2. 소스코드 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#include <iostream>
#include <algorithm>
int main()
{
int N, max = 0, value[1000], dp[1000];
std::cin >> N;
for (int i = 0; i < N; i++)
std::cin >> value[i];
for (int i = 0; i < N; i++)
{
int min = 0;
for (int j = 0; j < i; j++)
if (value[i] > value[j])
if (dp[j] > min) min = dp[j];
dp[i] = min + 1;
if (dp[i] > max) max = dp[i];
}
std::cout << max;
}
|
cs |
3. 결과 |
4. 피드백 |
-
뻔한 문제였는데 이상한데 꽂혀가지고 오래 걸렸다..
-
첫 번째 원소가 반드시 포함된다는 법은 없다.
-
핵심은 부분 수열의 원소가 오름차순이어야 한다는 것! 그러면 각각의 원소까지의 부분 수열은 자기보다 작은 것들로만 이뤄져 있다는 걸 체크했어야 했다. 흑 ㅜㅜ
'알고리즘 > BOJ' 카테고리의 다른 글
[C++] 백준 11722번 - 가장 긴 감소하는 부분 수열 (0) | 2020.03.22 |
---|---|
[C++] 백준 11055번 - 가장 큰 증가 부분 수열 (0) | 2020.03.22 |
[C++] 백준 2156번 - 포도주 시식 (0) | 2020.03.15 |
[C++] 백준 9465번 - 스티커 (0) | 2020.03.14 |
[C++] 백준 2193번 - 이친수 (0) | 2020.03.14 |