알고리즘 생각을 깊게 해야한다. 구하는 것은 가장 긴 부분수열의 길이이므로 문자열 자체를 구할 필요가 없다.
리스트를 순회하면서 현재 최대값보다 크다면 삽입하여 최대값을 갱신하고, 만약 현재 최대값보다 작다면 현재 리스트에서 알맞은 자리를 찾아 교체한다. 문자열 자체는 중요하지 않기에 가능한 방법이다.
만약 정답 문자열을 구해야 한다면, 교체 당한 숫자를 저장해둬서 처리해야 한다.
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
|
import sys
def find(x):
left, right = 1, len(stack)
while left < right:
mid = (left + right) // 2
if stack[mid] > x:
right = mid
elif stack[mid] < x:
left = mid + 1
else:
left = right = mid
return right
N = int(sys.stdin.readline())
dp = list(map(int, sys.stdin.readline().split()))
stack = [0]
for i in dp:
if stack[-1] < i:
stack.append(i)
else:
stack[find(i)] = i
print(len(stack) - 1)
|
cs |
'알고리즘' 카테고리의 다른 글
[BOJ] 1786 찾기 - kmp알고리즘 (0) | 2020.10.29 |
---|---|
[BOJ] 1629 곱셈 - 분할정복 (0) | 2020.10.29 |
[BOJ] 9251 LCS - DP, 문자열 (0) | 2020.10.29 |
[Programmers] 지형 이동(BFS, MST) (0) | 2020.10.07 |
[Baekjoon] 친구 네트워크(Union Find) (0) | 2020.09.24 |